SQLServer之修改FOREIGN KEY约束
使用ssms数据库管理工具修改foreign key约束
1、连接数据库,选择数据表-》右键点击-》选择设计(或者展开键,选择要修改的外键,右键点击,选择修改,后面修改步骤相同)。
2、在表设计窗口中-》选择要修改的外键列-》右键点击-》选择关系。
3、在外键关系弹出框中-》选中要修改的外键-》点击修改表和列规范。
4、在表和列弹出框中-》输入要修改的外建名-》选择要修改的主键基表-》选择要修改的主键基表的数据列-》选择要修改的外键基表-》选择要修改的外键基表数据列-》点击确定。
5、在外键关系弹出框中-》输入要修改的外键名称-》输入要修改的外键描述-》表设计规则可根据实际情况选择-》点击关闭。
6、点击保存(或者ctrl+s)-》关闭表设计器-》刷新表-》打开外键查看修改结果。
使用t-sql脚本修改foreign key约束
若要使用transact-sql修改foreign key约束,必须先删除现有的foreign key约束,然后再用新定义重新创建该约束。
语法:
--声明数据库
use 数据库名;
go
--判断如果存在外键则删除
if exists(select * from sysobjects where name=约束名)
alter table 表名 drop constraint 约束名;
go
--添加外键约束
alter table 表名 --外键基表,显示哪个表包含用作所选关系中外键的列。
[with check | with nocheck] --强制用于复制,指示当复制代理对此表执行插入、更新或删除操作时是否强制约束。
add constraint 约束名--标识类别,外键名称。
foreign key(列名) --外键列,显示哪个列用作所选关系的外键。
references 表名--主/唯一键基表,显示哪个表包含用作所选关系中主键(或唯一键)的列。
(列名) --主/唯一键列,显示哪个列用作所选关系的主键(或唯一键)。
--更新规则
--no action:不执行任何操作,错误消息告知用户不允许进行更新并将回滚 update。
--cascade:级联,更新所有包含外键关系所涉及数据的行。 如果该表将包含在使用逻辑记录的合并发布中,则不要指定 cascade。
--set null:设置null,如果表的所有外键列都可接受 null 值,则将该值设置为 null。
--set default:设置默认值,如果表的所有外键列均已定义默认值,则将值设置成为该列定义的默认值。
on update [no action | cascade | set null | set default]
--删除规则
--no action:不执行任何操作,错误消息告知用户不允许进行删除并将回滚 delete。
--cascade:级联,删除所有包含外键关系所涉及数据的行。 如果该表将包含在使用逻辑记录的合并发布中,则不要指定 cascade。
--set null:设置null,如果表的所有外键列都可接受 null 值,则将该值设置为 null。
--set default:设置默认值,如果表的所有外键列均已定义默认值,则将值设置成为该列定义的默认值。
on delete [no action | cascade | set null | set default]
go
--强制外键约束
--指示如果对关系中列数据的更改会使外键关系的完整性失效,是否允许进行这样的更改。 如果不允许这样的更改,则选择 “是” ;如果允许这样的更改,则选择 “否” 。
alter table 表名 [nocheck | check] constraint 约束名;
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='foreign1')
alter table test1 drop constraint foreign1;
go
--添加外键约束
alter table test1 --外键基表,显示哪个表包含用作所选关系中外键的列。
with check --强制用于复制,指示当复制代理对此表执行插入、更新或删除操作时是否强制约束。
add constraint foreign1 --标识类别,外键名称。
foreign key(classid) --外键列,显示哪个列用作所选关系的外键。
references test2 --主/唯一键基表,显示哪个表包含用作所选关系中主键(或唯一键)的列。
(id) --主/唯一键列,显示哪个列用作所选关系的主键(或唯一键)。
--更新规则
--no action:不执行任何操作,错误消息告知用户不允许进行更新并将回滚 update。
--cascade:级联,更新所有包含外键关系所涉及数据的行。 如果该表将包含在使用逻辑记录的合并发布中,则不要指定 cascade。
--set null:设置null,如果表的所有外键列都可接受 null 值,则将该值设置为 null。
--set default:设置默认值,如果表的所有外键列均已定义默认值,则将值设置成为该列定义的默认值。
on update cascade
--删除规则
--no action:不执行任何操作,错误消息告知用户不允许进行删除并将回滚 delete。
--cascade:级联,删除所有包含外键关系所涉及数据的行。 如果该表将包含在使用逻辑记录的合并发布中,则不要指定 cascade。
--set null:设置null,如果表的所有外键列都可接受 null 值,则将该值设置为 null。
--set default:设置默认值,如果表的所有外键列均已定义默认值,则将值设置成为该列定义的默认值。
on delete cascade
go
--强制外键约束
--指示如果对关系中列数据的更改会使外键关系的完整性失效,是否允许进行这样的更改。 如果不允许这样的更改,则选择 “是” ;如果允许这样的更改,则选择 “否” 。
alter table test1 nocheck constraint foreign1;
go
--添加外键约束描述
execute sp_addextendedproperty n'ms_description',n'修改外键约束',n'schema',n'dbo',n'table',n'test1',n'constraint',n'foreign1';
go
修改foreign key优缺点
优点:
1、保证数据的完整性。
2.、关联查询时,可以用到fk 的统计信息。
3、合理使用外键,可以增加查询效率。
缺点:
1、删队或更新关联数据时需要做检查,效率会很低。
2、数据量很大,并发量很大,会影响性能。
3、外键虽然保证完整性,但是对于主表删除这种操作,都级联扫描一遍所有的子表取删除,数据越大越慢,锁粒度也会大。
4、导入导出,其它高可用等手工调数据时非常麻烦给。