我正在尝试使用forein密钥在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');
答案 0 :(得分: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
或ON DELETE
子句执行的操作之外,父级不负责维护子表中的值。
迈克问:那么如何从父母那里填充孩子的专栏呢?
你不会。您将首先将该行定位(或插入)到父表。然后,您将保留id
列的值(或构成PRIMARY KEY的任何列的值),然后在插入子行时对子行的外键列使用相同的值(一个或多个)。
将外键设置为任意值(与父表中现有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
值匹配的值在员工表中。