在mysql中设置外键的语句

假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫作 pc;用来保存配件供货信息的表叫作 parts。 在 pc 表中有一个字段,用来描述这款电脑所使用的CPU型号; 在 parts 表中相应有一个字段,描述的正是CPU的型号,咱们能够把它想成是所有CPU的型号列表。 很显然,这个厂家生产的电脑,其使用的 cpu 必定是供货信息表(parts)中存在的型号。这时,两个表中就存在一种约束关系(constraint)—— pc 表中的 cpu 型号受到 parts 表中型号的约束。 首先咱们来建立 parts 表: CREATE TABLE parts ( ... 字段定义 ..., model VARCHAR(20) NOT NULL, ... 字段定义 ... ); 接下来是 pc 表: CREATE TABLE pc ( ... 字段定义 ..., cpumodel VARCHAR(20) NOT NULL, ... 字段定义 ... }; 设置索引 若要设置外键,在参照表 (referencing table,即pc表) 和被参照表 (referenced table,即parts表) 中,相对应的两个字段必须都设置索引 (index)。 对parts表: ALTER TABLE parts ADD INDEX idx_model (model); 这句话的意思是,为 parts 表增长一个索引,索引创建在 model 字段上,给这个索引发个名字叫idx_model。 对pc表也相似: ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel); 事实上这两个索引能够在建立表的时候就设置。这里只是为了突出其必要性。 定义外键 下面为两张表之间创建前面所述的那种“约束”。由于pc的CPU型号必须参照parts表中的相应型号,因此咱们将pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其余表。 ALTER TABLE pc ADD CONSTRAINT fk_cpu_model FOREIGN KEY (cpumodel) REFERENCES parts(model); 第一行是说要为pc表设置外键,给这个外键起一个名字叫作fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于parts表的model字段。 这样,咱们的外键就搞好了!若是咱们试着CREATE一台pc,它所使用的 cpu 的型号是 parts 表中不存在的,那么 MySQL 会禁止这台 PC 被 CREATE 出来。 级联操做 一切看起来都挺好的,不是吗? 考虑如下这种状况: 技术人员发现,一个月以前输入到 parts 表中的某个系列的 cpu (可能有不少款)的型号全都输错了一个字母,如今须要改正。咱们但愿的是,当 parts 表中那些 Referenced Column 有所变化时,相应表中的 Referencing Column 也能自动更正。 能够在定义外键的时候,在最后加入这样的关键字: ON UPDATE CASCADE; 即在主表更新时,子表(们)产生连锁更新动做,彷佛有些人喜欢把这个叫“级联”操做。:) 若是把这语句完整的写出来,就是: ALTER TABLE pc ADD CONSTRAINT fk_cpu_model FOREIGN KEY (cpumodel) REFERENCES parts(model) ON UPDATE CASCADE; 除了 CASCADE 外,还有 RESTRICT(禁止主表变动)、SET NULL(子表相应字段设置为空)等操做。 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子句的表定义。