'MUL' 只是意味着它不是唯一索引(即,KEY 允许重复值)。(如果它是唯一索引,则 Key 列将显示“UNI”)。FOREIGN KEY 约束与外键列的唯一性没有任何关系……它通常是非唯一的……父母通常可以有零个、一个或多个孩子。
FOREIGN KEY 约束不允许在子表中使用 NULL 值。只有 NOT NULL 约束(或触发器)会为您执行此操作。子表中的一行是孤儿,与父表无关是完全合理的。
对子表执行 INSERT 时,如果希望该行引用父表中的行,则需要为外键列提供非 NULL 值。
可以使用ON DELETE SET NULL
子句定义外键,但这仅在您稍后删除具有与其相关的子行的父行时才有效。在这种情况下,当删除父行时,子行的外键列值将设置为 NULL。
迈克说:我担心孩子的外键没有被父母填充。
父级不负责填充子级的外键列。当父项的 id 值更改时,可以选择让子项的外键值自动更新……保留关系:ON UPDATE CASCADE。ON UPDATE
但除了or子句执行的操作之外ON DELETE
,父表没有责任维护子表中的值。
迈克问:那么我如何让孩子的列从父母那里填充?
你不会的。您将首先定位(或插入)该行到父表。然后,您将保留id
列的值(或构成主键的任何列的值),然后在插入子行时将相同的值用于子行上的外键列。
当您将外键设置为任意值(与父表中现有的 PRIMARY KEY 值不匹配的值。这是预期的行为时,将返回错误。
如果在父行之前插入子行,则需要将外键列保留为 NULL,然后在知道id
父行的值后,您将更新子行以设置外键列。
create table employee
( id int
, first varchar(128)
, last varchar(128)
, primary key(id) ) engine=innodb;
create table borrow
(ref auto_increment
, empID int
, book varchar(128)
, primary key(ref) ) engine=innodb;
alter table borrow add constraint fk_borrow
foreign key (empID) references employee(id);
insert into employee (id, first, last) values (1, 'foo', 'bar');
insert into borrow (empID, book) values (1,'mike');
insert into borrow (empID, book) values (1,'mulligan');
添加到borrow
表中的两行与employee 中的行相关,因为外键列(empID) 中的值设置为与id
employee 表中的值匹配的值。