我有一个表,其中包含另一个表中行的id的列。但是,当正在填充表A时,表B可能会或可能没有为表A准备好一行。
我的问题是,是否可以让mysql阻止输入无效值但是可以使用NULL?或外键是否需要有效的相关值?
所以...我正在寻找的(伪代码)是这样的:
Table "person" id | name
Table "people" id | group_name | person_id (foreign key id from table person)
insert into person (1, 'joe');
insert into people (1, 'foo', 1)//kosher
insert into people (1, 'foo', NULL)//also kosher
insert into people(1, 'foo', 7)// should fail since there is no id 7 in the person table.
我需要这个的原因是我有一个鸡和蛋的问题,因为人们表中的行在手前创建是完全合理的(在这个例子中,我正在创建组,并希望他们预先存在加入他们的人)。而且我意识到这个例子很愚蠢,我只是将组ID放在人员表中而不是反之亦然,但在我现实世界中的问题是不可行的。
只是好奇我是否需要允许任何和所有值才能使其工作,或者是否有某种方法允许null。
答案 0 :(得分:2)
如果将列设置为可为空,则即使它是引用另一个表中的列的外键,它也可以包含NULL。
答案 1 :(得分:2)
外键可以为空。
当输入引用表中的行时,您必须更新该行以指向它。
答案 2 :(得分:1)
通过将列的可选性设置为NULL来设置外键列以接受空值:
DROP TABLE IF EXISTS `example`.`tableb`;
CREATE TABLE `example`.`tableb` (
`id` int(10) unsigned NOT NULL auto_increment,
`person_id` int(10) unsigned default NULL, -- notice, !say "NOT NULL" like id
PRIMARY KEY (`id`),
CONSTRAINT `FK_tableb_1` FOREIGN KEY (`person_id`) REFERENCES `tablea` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
也就是说,在尝试将空值插入tableb引用列之前,tablea必须至少有一条记录。否则,MySQL将抛出一个错误(无论如何,对我来说,4.1)。