这是我尝试执行SQL Server错误:'MODIFY'附近的语法不正确。在我的查询
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
Incorrect syntax near 'MODIFY'.
任何想法?
这是我尝试执行SQL Server错误:'MODIFY'附近的语法不正确。在我的查询
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
Incorrect syntax near 'MODIFY'.
任何想法?
添加新栏:
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
有一点要注意的是,改变现有列和太身份是相当棘手的。
编辑1:评论的ALTER
语法正确的突出问题,通过marc_s
相关的解决方案指出,可以在this answer找到。
看起来像你的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
将失败,因此需要解决这些问题。
你想添加一个新的列或只是修改一个现有的列? – Abhinav
'MODIFY'命令在SQL Server中不存在。你想达到什么目的?添加新列?改变现有?添加身份? –
你可以**(a)**添加一个新列,用ALTER TABLE ... ADD columnName ....或者**(b)**你可以用ALTER TABLE ... ALTER来改变列的定义COLUMN columnName ....' - 但SQL Server中没有'MODIFY'关键字,也不能将'IDENTITY'规范添加到现有列。 –