我在做SQL Server 2012
我有一个表,其主键列为INT。我需要将它更改为GUID。
我是否修改表并将int列移除为primary key
添加GUID列并将其设置为主列并删除旧的INT列?
谢谢。
发布于 2017-01-09 14:32:52
您不能更改主键列,除非您删除it..Any操作以更改其数据类型将导致以下错误。
对象'XXXX‘依赖于列'XXXX’。
唯一的选择就是
1.删除主键
2.改变数据类型
3.重新创建主键
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)从2012年起,有一个名为(DROP_EXISTING = ON)的子句使事情变得简单,通过在最后阶段删除聚集索引,并且在您的情况下使所有operations..But都可以使用旧索引,这个子句将无法工作。
所以我建议
1.使用不同的名称创建具有所需模式和索引的新表
2.从旧表插入数据到新表
3.最后,在切换时插入积累的数据。
4.将表重命名为旧表名
这样你的停机时间就会更少
发布于 2018-12-03 07:23:52
可以分三个步骤更改主键的日期类型。
步骤1 :-删除与主键关联的约束
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;步骤2 :-将Primay键列更改为有效的主键数据类型
ALTER TABLE table_name
ALTER COLUMN pk_column_name target_data_type(size) not null;步骤3 :-使更改后的列再次使用主键
ALTER TABLE table_name
ADD PRIMARY KEY (pk_column_name);PS :-
发布于 2018-02-08 13:26:44
下面是我编写的一个脚本,用于帮助我们部署对主键列数据类型的更改。
这个脚本假设没有任何非主键约束(例如外键)取决于这个列。
它有一些安全检查,因为它被设计为部署到不同的服务器(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.';
ENDhttps://stackoverflow.com/questions/41549549
复制相似问题