zoukankan      html  css  js  c++  java
  • 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、导入导出,其它高可用等手工调数据时非常麻烦给。

  • 相关阅读:
    RTP/RTSP编程
    makefile
    VS 2010内存泄漏检测
    Linux Shell中捕获CTRL+C
    const
    Hdu 5344
    Hdu5762
    CF1200C
    CF1200B
    CF1200A
  • 原文地址:https://www.cnblogs.com/vuenote/p/9603739.html
Copyright © 2011-2022 走看看