SQLServer之修改PRIMARY KEY

本文介绍了如何通过SSMS工具及T-SQL脚本在SQL Server中修改表的主键,包括步骤说明与示例代码,并探讨了不同主键类型的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文: SQLServer之修改PRIMARY KEY

使用SSMS数据库管理工具修改PRIMARY KEY

1、连接数据库,选择数据表-》右键点击-》选择设计(或者展开键,选择要修改的键,右键点击,选择修改,后面步骤相同)。

2、选择要修改的数据列-》右键点击-》选择索引/键。

3、在索引/键弹出框中-》选择要修改的主键-》类型选择主键-》点击列。

4、在索引列弹出框中-》选择主键数据列-》选择主键的排序规则-》点击确定。

5、在索引/键弹出框中-》输入要修改的主键名称-》输入要修改的主键描述-》表设计器规则可以使用系统默认-》点击关闭。

 

6、点击保存(或者ctrl+s)-》关闭表设计器-》刷新表-》查看修改结果。

使用T-SQL脚本修改PRIMARY KEY

若要使用 Transact-SQL 修改 PRIMARY KEY 约束,必须先删除现有的 PRIMARY KEY 约束,然后再用新定义重新创建该约束。

语法:

--声明使用数据库
use 数据库;
go

--如果已存在主键,则先删除再添加,如果不存在在则不删除
if exists(select * from sysobjects where name=主键名)
alter table 表名 drop constraint 主键名;
go

alter table 表名 
add constraint 主键名
primary key
[nonclustered | clustered]  ----在“表设计器”下的网格中,选择“创建为群集索引”,再从下拉列表中选择“是”创建群集索引,或选择“否”创建非群集索引。 对于每个表,只允许存在一个聚集索引。 如果此表中已经存在聚集索引,则您必须首先对原始索引清除此设置。
(列名 [asc | desc],列名 [asc | desc])
--statistics_norecompute=on:过时的统计信息不会自动重新计算。
--statistics_norecompute=off:启用自动统计信息更新。
--ignore_dup_key=on:打开,将重复键值插入唯一索引时会出现警告消息。只有违反唯一性约束的行才会失败。
--ignore_dup_key=off:关闭,将重复键值插入唯一索引时会出现错误消息。回滚整个INSERT操作。
--allow_row_locks=on:访问索引时允许行锁。数据库引擎确定何时使用行锁。
--allow_row_locks=off:不使用行锁。
--allow_page_locks=on:访问索引时允许页锁。数据库引擎确定何时使用页锁。
-- allow_page_locks=off:不使用页锁。
with(statistics_norecompute=off,ignore_dup_key=off,allow_row_locks=on,allow_page_locks=on) on [primary]
go

--添加主键描述
execute sp_addextendedproperty N'MS_Description', N'主键描述', N'SCHEMA', N'dbo', N'TABLE', N'表名', N'CONSTRAINT', N'主键名';
go

示例:

--声明使用数据库
use testss;
go

--如果已存在主键,则先删除再添加,如果不存在在则不删除
if exists(select * from sysobjects where name='PK__test1__3213E83F466EE881')
alter table test1 drop constraint PK__test1__3213E83F466EE881;
go

alter table test1
add constraint PK__test1__3213E83F466EE881
primary key
nonclustered ----在“表设计器”下的网格中,选择“创建为群集索引”,再从下拉列表中选择“是”创建群集索引,或选择“否”创建非群集索引。 对于每个表,只允许存在一个聚集索引。 如果此表中已经存在聚集索引,则您必须首先对原始索引清除此设置。
(id asc)
--statistics_norecompute=on:过时的统计信息不会自动重新计算。
--statistics_norecompute=off:启用自动统计信息更新。
--ignore_dup_key=on:打开,将重复键值插入唯一索引时会出现警告消息。只有违反唯一性约束的行才会失败。
--ignore_dup_key=off:关闭,将重复键值插入唯一索引时会出现错误消息。回滚整个INSERT操作。
--allow_row_locks=on:访问索引时允许行锁。数据库引擎确定何时使用行锁。
--allow_row_locks=off:不使用行锁。
--allow_page_locks=on:访问索引时允许页锁。数据库引擎确定何时使用页锁。
-- allow_page_locks=off:不使用页锁。
with(statistics_norecompute=off,ignore_dup_key=off,allow_row_locks=on,allow_page_locks=on) on [primary]
go

--添加主键描述
execute sp_addextendedproperty N'MS_Description', N'修改唯一主键', N'SCHEMA', N'dbo', N'TABLE', N'test1', N'CONSTRAINT', N'PK__test1__3213E83F466EE881';
go

 

修改PRIMARY KEY主键优缺点

优点:

1、主键可以是任意数据类型。

2、整型主键简单、效率高。

3、使用GUID作为主键安全,保证唯一性。

4、使用GUID作为主键不会产生自增字段那样数据合并时的问题。

缺点:

1、整型主键有数据条数的限制。

2、整型主键在数据库进行数据合并时会比较麻烦。

3、整型之外的数据类型毫无规律,要在上面建立索引很耗时,所以效率要比使用自增字段低。

4、整型之外的主键占用大量存储空间。

 

### SQL Server 中使用 MERGE 语句代替 ON DUPLICATE KEY UPDATE 在 SQL Server 中,`MERGE` 语句可以实现类似于 MySQL 的 `ON DUPLICATE KEY UPDATE` 功能。`MERGE` 语句允许根据条件检查目标表中的数据是否存在,如果存在则执行更新操作,如果不存在则插入新记录[^5]。 以下是一个使用 `MERGE` 语句的示例,展示如何实现类似的功能: ```sql -- 创建示例表 CREATE TABLE TargetTable ( ID INT PRIMARY KEY, Name NVARCHAR(50), Value INT ); -- 示例数据 INSERT INTO TargetTable (ID, Name, Value) VALUES (1, 'Test', 100); -- 使用 MERGE 语句实现插入或更新功能 MERGE TargetTable AS TARGET USING (VALUES (1, 'UpdatedName', 200), (2, 'NewName', 300)) AS SOURCE (ID, Name, Value) ON TARGET.ID = SOURCE.ID WHEN MATCHED THEN UPDATE SET TARGET.Name = SOURCE.Name, TARGET.Value = SOURCE.Value WHEN NOT MATCHED THEN INSERT (ID, Name, Value) VALUES (SOURCE.ID, SOURCE.Name, SOURCE.Value); ``` 上述代码中: - `TargetTable` 是目标表。 - `USING` 子句定义了源数据集(可以是表、查询结果或其他数据源)。 - `ON` 子句指定了匹配条件,这里是基于 `ID` 列。 - `WHEN MATCHED THEN UPDATE` 表示当匹配到记录时执行更新操作。 - `WHEN NOT MATCHED THEN INSERT` 表示当未匹配到记录时执行插入操作。 需要注意的是,在 SQL Server 中,`MERGE` 语句有严格的语法要求和限制。例如,`WHEN MATCHED` 子句只能包含一次 `UPDATE` 或 `DELETE` 操作[^5]。 此外,与 MySQL 的 `ON DUPLICATE KEY UPDATE` 不同,SQL Server 的 `MERGE` 语句需要显式指定匹配条件,而不能依赖唯一索引或主键自动触发更新操作[^1]。 ### 注意事项 - 在使用 `MERGE` 语句时,确保源数据和目标表的结构一致,并且匹配条件清晰明确。 - 如果需要处理大量数据,建议对目标表的相关列创建索引以提高性能。 - 当主键或其他唯一约束冲突时,SQL Server 不会像 MySQL 那样自动选择主键作为优先级[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值