是否有可能让mysql表接受引用不同表的primary_key列的空值?

时间:2010-06-12 23:59:46

标签: mysql

我有一个表,其中包含另一个表中行的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。

3 个答案:

答案 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)。