0

我正在尝试使用外键在 MySQL 中创建关系。每次我成功创建了 forien 键,但是当我描述表时,键被认为是“MUL”。在父表中插入一些记录后,我在子表中得到空值。我已经研究了好几个小时,却空手而归。我什至检查了 innodb 状态并且没有外键错误报告。我不完全确定为什么我得到空值,但我假设它是因为“MUL”键值。有人可以确认这一点并尝试帮助我吗?

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 borrow (empID, book) values (1,'mike');
4

1 回答 1

2

'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) 中的值设置为与idemployee 表中的值匹配的值。

于 2012-12-12T23:34:57.037 回答