sql server 外键 更新(删除)规则

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

http://hi.baidu.com/voll_shallen/blog/item/9abbe73e463e3ec97d1e718e.html

以前用数据库,一般都建表关系,但是这些关系建好了往往没有用到.

这次写一个项目,涉及到多表的外键约束和级联删除的问题,才研究了一下.

用的vs2005里面自带的SqlExpress,在VS里面作数据库,感觉不是很方便(废话,都方便了,那sqlserver2005 dev 卖给谁去!)

我建了表,然后建了关系,设定了外键约束.

然后就以为万事大吉了,去写代码,画界面去了.

把代码和界面搞定后,一试验删除,删除的级联链中间的一个表的数据,然后就报错.

Title

DELETE 语句与 REFERENCE 约束"FK_课程扩展信息表_教师表"冲突。该冲突发生于数据库"x:\xxx.MDF",表"dbo.课程扩展信息表", column '教师编号'。
语句已终止。



然后研究了下外键约束.到底是怎么回事.网上搜到一篇定义:

Title
FOREIGN KEY 约束
  • 如果在 FOREIGN KEY 约束的列中输入非 NULL 值,则此值必须在被引用的列中存在,否则将返回违反外键约束的错误信息。
  • FOREIGN KEY 约束应用于前面所讲的列,除非指定了源列。
  • FOREIGN KEY 约束仅能引用位于同一服务器上的同一数据库中的表。数据库间的引用完整性必须通过触发器实现。有关更多信息,请参见 CREATE TRIGGER
  • FOREIGN KEY 可以引用同一表中的其它列(自引用)。
  • 列级 FOREIGN KEY 约束的 REFERENCES 子句仅能列出一个引用列,且该列必须与定义约束的列具有相同的数据类型。
  • 表级 FOREIGN KEY 约束的 REFERENCES 子句中引用列的数目必须与约束列列表中的列数相同。每个引用列的数据类型也必须与列表中相应列的数据类型相同。
  • 如果 timestamp 类型的列是外键或被引用键的一部分,则不能指定 CASCADE。
  • 可以在相互间具有引用关系的表上组合使用 CASCADE 和 NO ACTION。如果 SQL Server 遇到 NO ACTION,将终止执行语句并回滚相关的 CASCADE 操作。当 DELETE 语句导致 CASCADE 和 NO ACTION 组合操作时,在 SQL Server 检查 NO ACTION 操作之前将执行所有 CASCADE 操作。
  • 一个表最多可包含 253 个 FOREIGN KEY 约束。
  • 对于临时表不强制 FOREIGN KEY 约束。
  • 每个表在其 FOREIGN KEY 约束中最多可以引用 253 个不同的表。
  • FOREIGN KEY 约束只能引用被引用表的 PRIMARY KEY 或 UNIQUE 约束中的列或被引用表上 UNIQUE INDEX 中的列。


仍然不解其意.

然后在关系图中的关系上点击右键,查看属性,发现其"INSERT 和 UPDATE 规范类别 "内都是"无操作",感觉应该是这里的问题.
上msdn上搜索了一下,发现了这篇文章: 可视化数据库工具-外键列属性
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vdt01/html/2cb23e81-6342-4390-9d0e-b7a4805eca0f.htm
关键的几句在这里:

Title
INSERT 和 UPDATE 规范类别

展开以显示有关该关系的“删除规则”和“更新规则”的信息。

删除规则

指定当数据库的最终用户尝试删除某一行,而该行包含外键关系所涉及的数据时所发生的情况。如果设置为:

  • 无操作    显示一条错误信息,告知用户不允许执行该删除操作,DELETE 将被回滚。

  • 级联    删除包含外键关系中所涉及的数据的所有行。

  • 设置空    如果表的所有外键列都可接受空值,则将该值设置为空。仅适用于 SQL Server 2005。

  • 设置默认值    如果表的所有外键列均已定义默认值,则将该值设置为列定义的默认值。仅适用于 SQL Server 2005。

更新规则

指定当数据库的用户尝试更新某一行,而该行包含外键关系所涉及的数据时所发生的情况。如果设置为:

  • 无操作    显示一条错误信息,告知用户不允许执行该删除操作,DELETE 将被回滚。

  • 级联    删除包含外键关系中所涉及的数据的所有行。

  • 设置空    如果表的所有外键列都可接受空值,则将该值设置为空。仅适用于 SQL Server 2005。

  • 设置默认值    如果表的所有外键列均已定义默认值,则将该值设置为列定义的默认值。仅适用于 SQL Server 2005。



总算是明白了:
1.在vs2005中,外键约束的属性窗口中它不叫"级联",叫"层叠",估计是翻译错误.
2.vs2005中,在关系图中建立外键约束,它"默认的INSERT 和 UPDATE 规范"都是"无操作".
   也就是说,你只要更新或删除,它都会报错.
3.解决的方法:
   a.删除的时候好办,级联删除就可以了.但更新的时候还得好好考虑.
   b.或者干脆去掉外键约束,自己考虑,然后写transcation sql.



本文转自火地晋博客园博客,原文链接:http://www.cnblogs.com/yelaiju/archive/2010/05/31/1748380.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
[MySQL]SQL优化之索引的使用规则
[MySQL]SQL优化之索引的使用规则
|
7月前
|
SQL 数据处理 数据库
时序数据库 TDengine SQL 查询语法规则汇总,官方教程奉上!
TDengine 采用 SQL 作为查询语言,本文将就部分查询细则做分析。
293 1
|
4月前
|
SQL Oracle 关系型数据库
SQL FOREIGN KEY 约束- 保障表之间关系完整性的关键规则
SQL FOREIGN KEY 约束用于防止破坏表之间关系的操作。FOREIGN KEY 是一张表中的字段(或字段集合),它引用另一张表中的主键。具有外键的表称为子表,具有主键的表称为被引用表或父表。
87 0
SQL FOREIGN KEY 约束- 保障表之间关系完整性的关键规则
|
9月前
|
SQL 存储 数据库
SQL Server——规则是什么?规则和约束有什么不同?
是单独的SQL Server对象,可以关联到一个或几个表中的一列或几列。它可以使用多种方式来完成对数据值的检验,可以使用函数返回验证信息,也可以使用关键字BETWEEN、LIKE和IN完成对输入数据的检查
|
9月前
|
SQL 存储 XML
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
75 0
|
10月前
|
SQL
java202303java学习笔记第四十四天函数-使用规则-进阶sql优化1
java202303java学习笔记第四十四天函数-使用规则-进阶sql优化1
40 0
|
12月前
|
存储 SQL Java
Android 通讯录号码匹配规则 SQL
Android 通讯录号码匹配规则 SQL
91 0
|
SQL 存储 关系型数据库
我的sql没问题为什么还是这么慢|MySQL加锁规则
导致数据库访问速度变慢的原因有很多:sql语句编写不规范、数据库服务器的性能差、网络状况不佳等,但是本文所侧重的点在于探究MySQL的锁机制,在其中发挥了什么作用。
126 0
我的sql没问题为什么还是这么慢|MySQL加锁规则
|
SQL 数据库 数据库管理
SQL关系模型之外键
引入 我们在之前的文章中了解了sql关系数据库中非常重要的概念——关系模型,并具体了解了控制表中关系的概念之一“主键”。 而关系数据库的“关系”可不仅仅局限在表内。表与表的关系才是关系数据库的精髓。而负责控制表与表关系的工具是什么呢?我们引入了“外键”的概念。