Guy*_*gar 13 primary-key sql-server-2012
我正在努力SQL Server 2012:
我有一个主键列表INT.我需要将其更改为GUID.
我是否更改了表并删除了int列primary key?
添加GUID列并将其设置为Primary并删除旧的INT列?
谢谢.
The*_*war 17
您无法更改主键列,除非您删除它.任何更改其数据类型的操作都将导致以下错误.
对象'PK__t1__7D78A4E7'取决于列'id'.
唯一的选择是
1.Drop主键
2.更改数据类型
3.recreate主键
ALTER TABLE t1
DROP CONSTRAINT PK__t1__3213E83F88CF144D;
GO
alter table t1
alter column id varchar(10) not null
alter table t1 add primary key (id)
Run Code Online (Sandbox Code Playgroud)
从2012年开始,有一个叫做(DROP_EXISTING = ON)简单的子句,通过在最后阶段删除聚集索引并保持旧索引可用于所有操作.但在你的情况下,这个子句将不起作用.
所以我推荐
1.创建具有所需模式和索引的新表,使用不同的名称
2.将数据从旧表
插入到新表3.最后在切换时插入已累积的数据
4.将表重命名为旧表名
这样您可以减少停机时间
小智 10
可以分三步更改主键的日期类型
第 1 步:- 删除与主键关联的约束
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
Run Code Online (Sandbox Code Playgroud)
第 2 步:- 将 Primay 键列更改为有效的主键数据类型
ALTER TABLE table_name
ALTER COLUMN pk_column_name target_data_type(size) not null;
Run Code Online (Sandbox Code Playgroud)
第 3 步:- 再次使更改的列主键
ALTER TABLE table_name
ADD PRIMARY KEY (pk_column_name);
Run Code Online (Sandbox Code Playgroud)
附:-
当您尝试更改 pk_column 时,您可以从错误消息中获取约束名称
如果 pk_column 中已有数据,请确保该列的源数据类型和目标数据类型均可用于现有数据。否则需要另外两个步骤将现有数据移动到临时列,然后执行这些步骤并在审查和删除该临时列后恢复该数据。
下面是我编写的一个脚本,用于帮助我们部署对主键列数据类型的更改。
该脚本假设不存在任何依赖于此列的非主键约束(例如外键)。
它有一些安全检查,因为它被设计为部署到不同的服务器(dev、uat、live),如果服务器上的表有某种不同,则不会产生副作用。
我希望这可以帮助别人。如果您在投票之前发现任何问题,请告诉我。我非常乐意更新脚本。
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C WITH (NOLOCK) WHERE C.TABLE_CATALOG = '<<DB>>' AND C.TABLE_SCHEMA = 'dbo' AND C.TABLE_NAME = '<<Table>>'
AND C.COLUMN_NAME = '<<COLUMN>>' AND C.DATA_TYPE = 'int') -- <- Additional test to check the current datatype so this won't make unnecessary or wrong updates
BEGIN
DECLARE @pkName VARCHAR(200);
SELECT @pkName = pkRef.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pkRef WITH (NOLOCK)
WHERE pkRef.TABLE_CATALOG = '<<DB>>' AND pkRef.TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '<<Table>>'
IF(@pkName IS NOT NULL)
BEGIN
-- Make sure the primary key name is the one you are going to use in script beyond this point.
IF(@pkName != '<<PRIMARY KEY NAME>>')
BEGIN
RAISERROR ('Unexpected primary key name - The primary key found has a different name than expected. Please update the script.', 16, 1);
RETURN;
END
ALTER TABLE dbo.<<Table>>
DROP CONSTRAINT <<PRIMARY KEY NAME>>; -- Note: this is not a string or a variable (just type the PK name)
SELECT 'Dropped existing primary key';
END
ALTER TABLE dbo.<<Table>> ALTER COLUMN ID BIGINT
SELECT 'Updated column type to big int';
ALTER TABLE dbo.<<Table>>
ADD CONSTRAINT <<PRIMARY KEY NAME>> PRIMARY KEY CLUSTERED (<<COLUMN>>);
SELECT 'Created the primary key';
END
ELSE
BEGIN
SELECT 'No change required.';
END
Run Code Online (Sandbox Code Playgroud)