在没有 IDENTITY 的情况下插入列
Insert into column without having IDENTITY
我有一个table
CREATE TABLE [misc]
(
[misc_id] [int] NOT NULL,
[misc_group] [nvarchar](255) NOT NULL,
[misc_desc] [nvarchar](255) NOT NULL
)
misc_id [int] not null
应该是 IDENTITY (1,1)
但不是,现在我遇到了问题
用一个简单的表格插入这个 table 但是因为 misc_id
正在寻找一个用户不知道的数字,除非他们可以访问数据库。
我知道一个选项是创建另一列使其成为 IDENTITY(1,1)
并复制该数据。
还有其他方法可以解决这个问题吗?
INSERT INTO misc (misc_group, misc_desc)
VALUES ('#misc_group#', '#misc_desc#')
我有 SQL Server 2012
将 int 列更改为标识可能会导致问题,因为默认情况下您无法在不使用 set identity_insert 命令的情况下将值插入标识列。因此,如果您有将值插入标识列的现有代码,它将失败。但是,允许 SQL 服务器插入值(即将其更改为标识列)要容易得多,因此我会将 misc_id 更改为标识列并确保没有程序将值插入 misc_id.
如果无法更改 table,您可以尝试使用不同的 table 插入最新的 [misc_id] 值,因此每当您将新记录插入table,你检索这个值,加 1,并将它用作你的新 Id。只是不要忘记在之后更新 table。
您应该使用所需的标识列重新创建 table。以下陈述将使您接近。 SQL 服务器会在您迁移数据时自动将 table 的标识字段调整为 MAX(misc_id) + 1。
您显然需要停止尝试插入 misc_id 新记录。您需要在插入记录后检索 SCOPE_IDENTITY() 列。
-- Note: I'd recommend having SSMS generate your base create statement so you know you didn't miss anything. You'll have to export the indexes and foreign keys as well. Add them after populating data to improve performance and reduce fragmentation.
CREATE TABLE [misc_new]
(
[misc_id] [int] NOT NULL IDENTITY(1,1),
[misc_group] [nvarchar](255) NOT NULL,
[misc_desc] [nvarchar](255) NOT NULL
-- Todo: Don't forget primary key but can be added later (not recommended).
)
GO
SET IDENTITY_INSERT misc_new ON;
INSERT INTO misc_new
(
[misc_id],
[misc_group],
[misc_desc]
)
SELECT
[misc_id],
[misc_group],
[misc_desc]
FROM misc
ORDER BY misc_id;
SET IDENTITY_INSERT misc_new OFF;
GO
EXEC sp_rename 'misc', 'misc_old';
EXEC sp_rename 'misc_new', 'misc';
GO
在 MSSQL 2012
中您可以使用 SEQUENCE
个对象:
CREATE SEQUENCE [dbo].[TestSequence]
AS [BIGINT]
START WITH 1
INCREMENT BY 1
GO
将 START WITH 1
中的 1
更改为 MAX value for [misc_id] + 1
。
用法:
INSERT INTO misc (misc_id, misc_group, misc_desc)
VALUES (NEXT VALUE FOR TestSequence, '#misc_group#','#misc_desc#')
我有一个table
CREATE TABLE [misc]
(
[misc_id] [int] NOT NULL,
[misc_group] [nvarchar](255) NOT NULL,
[misc_desc] [nvarchar](255) NOT NULL
)
misc_id [int] not null
应该是 IDENTITY (1,1)
但不是,现在我遇到了问题
用一个简单的表格插入这个 table 但是因为 misc_id
正在寻找一个用户不知道的数字,除非他们可以访问数据库。
我知道一个选项是创建另一列使其成为 IDENTITY(1,1)
并复制该数据。
还有其他方法可以解决这个问题吗?
INSERT INTO misc (misc_group, misc_desc)
VALUES ('#misc_group#', '#misc_desc#')
我有 SQL Server 2012
将 int 列更改为标识可能会导致问题,因为默认情况下您无法在不使用 set identity_insert 命令的情况下将值插入标识列。因此,如果您有将值插入标识列的现有代码,它将失败。但是,允许 SQL 服务器插入值(即将其更改为标识列)要容易得多,因此我会将 misc_id 更改为标识列并确保没有程序将值插入 misc_id.
如果无法更改 table,您可以尝试使用不同的 table 插入最新的 [misc_id] 值,因此每当您将新记录插入table,你检索这个值,加 1,并将它用作你的新 Id。只是不要忘记在之后更新 table。
您应该使用所需的标识列重新创建 table。以下陈述将使您接近。 SQL 服务器会在您迁移数据时自动将 table 的标识字段调整为 MAX(misc_id) + 1。
您显然需要停止尝试插入 misc_id 新记录。您需要在插入记录后检索 SCOPE_IDENTITY() 列。
-- Note: I'd recommend having SSMS generate your base create statement so you know you didn't miss anything. You'll have to export the indexes and foreign keys as well. Add them after populating data to improve performance and reduce fragmentation.
CREATE TABLE [misc_new]
(
[misc_id] [int] NOT NULL IDENTITY(1,1),
[misc_group] [nvarchar](255) NOT NULL,
[misc_desc] [nvarchar](255) NOT NULL
-- Todo: Don't forget primary key but can be added later (not recommended).
)
GO
SET IDENTITY_INSERT misc_new ON;
INSERT INTO misc_new
(
[misc_id],
[misc_group],
[misc_desc]
)
SELECT
[misc_id],
[misc_group],
[misc_desc]
FROM misc
ORDER BY misc_id;
SET IDENTITY_INSERT misc_new OFF;
GO
EXEC sp_rename 'misc', 'misc_old';
EXEC sp_rename 'misc_new', 'misc';
GO
在 MSSQL 2012
中您可以使用 SEQUENCE
个对象:
CREATE SEQUENCE [dbo].[TestSequence]
AS [BIGINT]
START WITH 1
INCREMENT BY 1
GO
将 START WITH 1
中的 1
更改为 MAX value for [misc_id] + 1
。
用法:
INSERT INTO misc (misc_id, misc_group, misc_desc)
VALUES (NEXT VALUE FOR TestSequence, '#misc_group#','#misc_desc#')