这是我尝试执行的查询
use [warz]
go
ALTER TABLE dbo.items_lootdata
MODIFY TABLE [RecordID] [int] IDENTITY(1,1) NOT NULL
go
我收到了错误:
Msg 102,Level 15,State 1,Line 3
'MODIFY'附近的语法不正确。
有什么想法吗?
答案 0 :(得分:3)
添加新列:
use [warz]
go
ALTER TABLE dbo.items_lootdata
ADD [RecordID] [int] IDENTITY(1,1) NOT NULL
go
修改现有列:
use [warz]
go
-- remember you cannot alter an existing column to
-- identity, following is only for syntax
ALTER TABLE dbo.items_lootdata
ALTER COLUMN [RecordID] [int] IDENTITY(1,1) NOT NULL
go
需要注意的一点是,更改现有列以及在Identity中也是如此。
修改1:评论ALTER
语法,以正确突出marc_s指出的问题
相关解决方案可在this answer找到。
答案 1 :(得分:0)
您的MODIFY TABLE
可能应该是ALTER COLUMN
。
IDENTITY
可能会很痛苦,因为你不会把它作为一个属性添加到列中。包含IDENTITY
列的表需要创建它们(IDENTITY
列),这样就可以创建,之后也不容易摆脱该属性。
假设你有一个或多或少像这样的表:
IF NOT EXISTS ( SELECT 1
FROM sys.objects
WHERE name = 'items_lootdata'
AND type = 'U' )
BEGIN
CREATE TABLE dbo.items_lootdata
(
RecordID INTEGER NOT NULL,
MoreData BIT
);
END;
GO
如果您希望RecordID成为IDENTITY
启用列,如果您的表当前为空,则只需重新创建对象:
IF NOT EXISTS ( SELECT 1
FROM sys.objects
WHERE name = 'items_lootdata'
AND type = 'U' )
BEGIN
CREATE TABLE dbo.items_lootdata
(
RecordID INTEGER IDENTITY( 1, 1 ) NOT NULL,
MoreData BIT
);
END;
GO
但是,如果可能的话,我更喜欢执行元数据切换,因为它还会保留表中当前包含的任何数据。这涉及重命名,创建新表和交换机本身。您可能还希望将IDENTITY
列的第一个参数设置为大于或等于RecordID的当前最大值,因为我假设您将要在该列上放置主键之后。
IF NOT EXISTS ( SELECT 1
FROM sys.objects
WHERE name = 'items_lootdata'
AND type = 'U' )
BEGIN
--DROP TABLE dbo.items_lootdata;
CREATE TABLE dbo.items_lootdata
(
RecordID INTEGER NOT NULL,
MoreData BIT
);
INSERT INTO dbo.items_lootdata( RecordID, MoreData )
VALUES( 1, 1 );
END;
GO
EXECUTE dbo.sp_rename @objname = 'dbo.items_lootdata', @newname = 'items_lootdata_old'
IF NOT EXISTS ( SELECT 1
FROM sys.objects
WHERE name = 'items_lootdata'
AND type = 'U' )
BEGIN
--DROP TABLE dbo.items_lootdata;
CREATE TABLE dbo.items_lootdata
(
RecordID INTEGER IDENTITY( 1, 1 ) NOT NULL,
MoreData BIT
);
END;
GO
ALTER TABLE dbo.items_lootdata_old
SWITCH TO dbo.items_lootdata;
GO
DROP TABLE dbo.items_lootdata_old;
GO
INSERT INTO dbo.items_lootdata ( MoreData )
VALUES ( 0 );
GO
SELECT *
FROM dbo.items_lootdata;
请注意,要使ALTER ... SWITCH
生效,您可能需要在尝试之前修改实际可以同步的内容。如果结构不相同(即:原始RecordID列可以为空),SWITCH
将失败,因此需要解决这些问题。