代码之家  ›  专栏  ›  技术社区  ›  Yevgeny Simkin

是否可以让MySQL表接受引用其他表的主键列的空值?

  •  1
  • Yevgeny Simkin  · 技术社区  · 15 年前

    我有一个表,其中有一列保存另一个表中一行的ID。但是,当填充表A时,表B可能有一行,也可能没有一行准备好用于表A。

    我的问题是,是否可以让MySQL阻止输入无效的值,但可以使用空值?或者外键是否需要有效的相关值?

    所以…我要找的(伪代码)是:

    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放在个人表中,而不是相反,但在我的实际问题中,这是不可行的。

    只是好奇我是否需要允许任何和所有的值来完成这项工作,或者是否有某种方法允许空值。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Mark Byers    15 年前

    如果将列设置为可以为空,则即使它是引用另一个表中的列的外键,它也可以包含空。

        2
  •  2
  •   duffymo    15 年前

    外键可以为空。

    当输入被引用表中的行时,必须更新该行以指向它。

        3
  •  1
  •   OMG Ponies    15 年前

    通过将列的可选性设置为空,可以将外键列设置为接受空值:

    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上)。