我有张桌子
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),但现在不是,现在我有问题了
使用一个简单的表单将其插入到此表中,但由于misc_id正在寻找一个用户不知道的数字,除非他们能够访问数据库。
我知道一个选项是创建另一个列,使其成为IDENTITY(1,1)并复制该数据。
还有别的办法可以绕过这件事吗?
INSERT INTO misc (misc_group, misc_desc)
VALUES ('#misc_group#', '#misc_desc#')我有Server 2012
发布于 2015-03-16 22:54:53
您应该使用所需的标识列重新创建表。下面的语句将使您接近。在迁移数据时,Server将自动将表的标识字段调整为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发布于 2015-03-16 22:15:13
将int列更改为标识可能会导致问题,因为默认情况下,如果不使用set identity_insert命令,就不能将值插入标识列。因此,如果您有将值插入标识列的现有代码,则它将失败。但是,允许Server插入值(即将其更改为标识列)要容易得多,因此我将将misc_id更改为标识列,并确保没有程序将值插入到misc_id中。
发布于 2015-03-16 22:30:34
如果更改表不是选项,则可以尝试使用不同的表插入最新的misc_id值,因此每当您向表中插入新记录时,都会检索该值、添加1,并将其用作新Id。只是别忘了在那之后更新表格。
https://stackoverflow.com/questions/29087658
复制相似问题