我有一张桌子
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#')
我有SQL Server 2012
答案 0 :(得分:0)
将int列更改为标识可能会导致问题,因为默认情况下,如果不使用set identity_insert命令,则无法将值插入标识列。因此,如果您有现有的代码将值插入标识列,它将失败。但是,允许SQL Server插入值(即将其更改为标识列)更容易,因此我将misc_id更改为标识列,并确保没有程序将值插入misc_id。
答案 1 :(得分:0)
如果不能选择更改表,您可以尝试使用插入了最新[misc_id]值的不同表,因此每当您在表中插入新记录时,都会检索此值,添加1并使用它作为你的新ID。只是不要忘记更新表后。
答案 2 :(得分:0)
您应该使用所需的标识列重新创建表。以下陈述将为您提供帮助。当您迁移数据时,SQL 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
答案 3 :(得分:0)
在MSSQL 2012
中,您可以使用SEQUENCE
个对象:
CREATE SEQUENCE [dbo].[TestSequence]
AS [BIGINT]
START WITH 1
INCREMENT BY 1
GO
使用1
更改START WITH 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#')