Tom*_*ski 160 t-sql sql-server identity sql-server-2005 sql-server-2005-express
我有一个Test带有列的表的MS SQL 2005数据库ID.ID是一个标识列.
我在这个表中有行,并且所有行都有相应的ID自动增量值.
现在我想更改此表中的每个ID,如下所示:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我收到一个错误:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Run Code Online (Sandbox Code Playgroud)
我试过这个:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Run Code Online (Sandbox Code Playgroud)
但这并没有解决问题.
我需要将标识设置为此列,但我还需要不时更改值.所以我的问题是如何完成这项任务.
A-K*_*A-K 220
你需要
set identity_insert YourTable ON
Run Code Online (Sandbox Code Playgroud)
然后删除您的行并使用不同的标识重新插入它.
完成插入后,不要忘记关闭identity_insert
set identity_insert YourTable OFF
Run Code Online (Sandbox Code Playgroud)
Mar*_*ith 40
IDENTITY 列值是不可变的.
但是,可以切换表元数据以删除IDENTITY属性,执行更新,然后切换回来.
假设有以下结构
CREATE TABLE Test
(
ID INT IDENTITY(1,1) PRIMARY KEY,
X VARCHAR(10)
)
INSERT INTO Test
OUTPUT INSERTED.*
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'
Run Code Online (Sandbox Code Playgroud)
那你可以做
/*Define table with same structure but no IDENTITY*/
CREATE TABLE Temp
(
ID INT PRIMARY KEY,
X VARCHAR(10)
)
/*Switch table metadata to new structure*/
ALTER TABLE Test SWITCH TO Temp;
/*Do the update*/
UPDATE Temp SET ID = ID + 1;
/*Switch table metadata back*/
ALTER TABLE Temp SWITCH TO Test;
/*ID values have been updated*/
SELECT *
FROM Test
/*Safety check in case error in preceding step*/
IF NOT EXISTS(SELECT * FROM Temp)
DROP TABLE Temp /*Drop obsolete table*/
Run Code Online (Sandbox Code Playgroud)
在SQL Server 2012中,可以使用自动递增列,也可以更直接地更新 SEQUENCES
CREATE SEQUENCE Seq
AS INT
START WITH 1
INCREMENT BY 1
CREATE TABLE Test2
(
ID INT DEFAULT NEXT VALUE FOR Seq NOT NULL PRIMARY KEY,
X VARCHAR(10)
)
INSERT INTO Test2(X)
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'
UPDATE Test2 SET ID+=1
Run Code Online (Sandbox Code Playgroud)
Mic*_*yor 26
通过SQL Server 2005管理器中的UI,更改列删除列的自动编号(标识)属性(通过右键单击选择表并选择"设计").
然后运行您的查询:
UPDATE table SET Id = Id + 1
Run Code Online (Sandbox Code Playgroud)
然后,将autonumber属性添加回列.
Mil*_*s D 18
首先,为此开启或关闭IDENTITY_INSERT的设置将不适用于您需要的内容(它用于插入新值,例如插入间隙).
通过GUI执行操作只会创建一个临时表,将所有数据复制到没有标识字段的新表中,并重命名该表.
这可以使用临时表来完成.
比方说,你test的表有两个附加列(column2和column3),并有2个表有外键引用test所谓的foreign_table1和foreign_table2(因为现实生活中的问题从来都不简单).
alter table test nocheck constraint all;
alter table foreign_table1 nocheck constraint all;
alter table foreign_table2 nocheck constraint all;
set identity_insert test on;
select id + 1 as id, column2, column3 into test_copy from test v;
delete from test;
insert into test(id, column2, column3)
select id, column2, column3 from test_copy
alter table test check constraint all;
alter table foreign_table1 check constraint all;
alter table foreign_table2 check constraint all;
set identity_insert test off;
drop table test_copy;
Run Code Online (Sandbox Code Playgroud)
而已.
小智 6
DBCC CHECKIDENT('databasename.dbo.orders',RESEED,999)您可以使用此命令更改任何标识列号,并且您也可以从您想要的每个数字开始该字段编号.例如,在我的命令中,我要求从1000(999 + 1)希望它就够了......祝你好运