MYSQL数据库建立的时候,建立外键时,删除规则和更新规则里都有五个可选项:限制、层叠、设为空、设为默认值、不活动。
谁能分别说明一下它们的区别啊?还有按一般经验,是怎么建立怎么选好呢?另外,还有个 “匹配”的属性,里面有 “完整” 和 “部分” 可供选择,这个是做什么用的呢? 怎么个选法呢?谢谢啦~~ 百度找了半天没找到相关说法,各位达人比百度还知道了都。。呵呵 

解决方案 »

  1.   

    超级无敌好用的MYSQL-FRONT
      

  2.   


    限制、RESTRICT  (A value cannot be updated when a row exists in a foreign key table that references the value in the referenced table.Similarly, a row cannot be deleted as long as there is a reference to it from a foreign key table.) 子表中无法添加主表没有的记录,主表也无法删除/更新在子表中记录的层叠、CASCADE 更常的翻译是 级联.  当主表中记录被删除时,同时删除所有子表中相关记录。 主表中记录被更新时所有子表相关记录同时更新设为空、SET NULL, 主表删除后,子表相关记录对应字段设置为NULL,设为默认值、 MYSQL不支持!
    不活动 NO ACTION,与RESTRICT 非常相似,不过这个检查是在语句执行完后再进行检查,RESTRICT则是在语句执行前检查。这样如果你的TRIGGER中有什么操作,执行后检查的数据则可能符合参照限制。
      

  3.   

    你看下
    http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#using-innodb-tables里面
    15.2.6.4.外键约束
    这一节你就明白了
      

  4.   

    mysql 官方文档中的说明。比较奇怪,英文版中并没有SET DEFAULT这个说明。InnoDB拒绝任何试着在子表创建一个外键值而不匹配在父表中的候选键值的INSERT或UPDATE操作。一个父表有一些匹配的行的子表,InnoDB对任何试图更新或删除该父表中候选键值的UPDATE或DELETE操作有所动作,这个动作取决于用FOREIGN KEY子句的ON UPDATE和ON DETETE子句指定的referential action。当用户试图从一个父表删除或更新一行之时,且在子表中有一个或多个匹配的行,InnoDB根据要采取的动作有五个选择:·         CASCADE: 从父表删除或更新且自动删除或更新子表中匹配的行。ON DELETE CASCADE和ON UPDATE CASCADE都可用。在两个表之间,你不应定义若干在父表或子表中的同一列采取动作的ON UPDATE CASCADE子句。 ·         SET NULL: 从父表删除或更新行,并设置子表中的外键列为NULL。如果外键列没有指定NOT NULL限定词,这就是唯一合法的。ON DELETE SET NULL和ON UPDATE SET NULL子句被支持。·         NO ACTION: 在ANSI SQL-92标准中,NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒绝对父表的删除或更新操作。 ·         RESTRICT: 拒绝对父表的删除或更新操作。NO ACTION和RESTRICT都一样,删除ON DELETE或ON UPDATE子句。(一些数据库系统有延期检查,并且NO ACTION是一个延期检查。在MySQL中,外键约束是被立即检查的,所以NO ACTION和RESTRICT是同样的)。 ·         SET DEFAULT: 这个动作被解析程序识别,但InnoDB拒绝包含ON DELETE SET DEFAULT或ON UPDATE SET DEFAULT子句的表定义。 当父表中的候选键被更新的时候,InnoDB支持同样选择。选择CASCADE,在子表中的外键列被设置为父表中候选键的新值。以同样的方式,如果在子表更新的列参考在另一个表中的外键,更新级联。