我是RDBMS的学生。
我有一个非常基本的问题,就是说我在SQL服务器中有一个现有的表。什么是改变表的脚本。
答案 0 :(得分:42)
在SQL Server 2005或更高版本中,您可以使用此脚本:
-- drop PK constraint if it exists
IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable')
ALTER TABLE dbo.YourTable
DROP CONSTRAINT PK_YourTable
GO
-- drop column if it already exists
IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable'))
ALTER TABLE dbo.YourTable DROP COLUMN RowId
GO
-- add new "RowId" column, make it IDENTITY (= auto-incrementing)
ALTER TABLE dbo.YourTable
ADD RowId INT IDENTITY(1,1)
GO
-- add new primary key constraint on new column
ALTER TABLE dbo.YourTable
ADD CONSTRAINT PK_YourTable
PRIMARY KEY CLUSTERED (RowId)
GO
当然,如果其他表使用外键约束将dbo.YourTable
引用到预先存在的RowId
列上,则此脚本可能仍会失败...
更新:和当然,在我使用dbo.YourTable
或PK_YourTable
的任何地方,您必须使用实际替换这些占位符你自己数据库中的表/约束名称(你没有在你的问题中提到它们是什么......)
答案 1 :(得分:8)
注意:在更新问题之前添加了此答案
示例脚本:
CREATE TABLE whatever (
OldPKColumn uniqueidentifier NOT NULL,
CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn)
)
ALTER TABLE whatever
ADD RowId int NOT NULL IDENTITY (1,1);
ALTER TABLE whatever
DROP CONSTRAINT PK_whatever;
ALTER TABLE whatever WITH CHECK
ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId);
ALTER TABLE whatever
DROP COLUMN oldPKcolumn;
一个随意的想法......你想重置IDENTITY列吗? 如果是,请使用DBCC CHECKIDENT
答案 2 :(得分:3)
只是评论来改进这些出色的答案(暂时不能使用评论 - 我是远离该特权的一个声誉点)以及作为我自己的未来参考:
可以添加新的IDENTITY(自动编号)列,并将主键设置为单个语句:
ALTER TABLE [TableName] ADD [ColumnName] int IDENTITY PRIMARY KEY;
在没有帮助的情况下,我宁愿不打扰约束名称。
您可以在IDENTITY
关键字之后的parantheses之间指定种子(以及增量)值。