【问题标题】:foreign key constraints. can child table have null values? ERROR 1452 (23000)外键约束。子表可以有空值吗?错误 1452 (23000)
【发布时间】:2015-05-03 22:20:58
【问题描述】:

我有一个这样设置的受控词汇表:

-- create the film_stock table
DROP TABLE IF EXISTS film_stock;
CREATE TABLE film_stock (
    stock varchar (10) NOT NULL,
    PRIMARY KEY(stock))
    ENGINE = INNODB;

“库存”只有两个值 - 硝酸盐和醋酸盐。

'stock' 在我的表电影中用作外键:

-- create the films table
DROP TABLE IF EXISTS films;
CREATE TABLE films (
    title varchar (100) NOT NULL,
    alternate_title varchar (50) NULL,
    year_of_release varchar (15) NULL,  
    country varchar (50) NULL,
    running_time_minutes int (10) NULL,
    footage_lenght_feet int (10) NULL,
    stock varchar (10) NULL,
    gauge varchar (10) NULL,
    bw_color varchar (10) NULL,
    notes varchar (255) NULL,
    print_publications varchar (255) NULL,
    existent_print varchar (255) NULL,
    url_1 varchar (100) NULL,
    url_2 varchar (100) NULL,
    url_3 varchar (100) NULL,
    PRIMARY KEY(title),
    FOREIGN KEY(country) REFERENCES countries (country),
    FOREIGN KEY(stock) REFERENCES film_stock (stock),
    FOREIGN KEY(gauge) REFERENCES film_gauge (gauge),
    FOREIGN KEY(bw_color) REFERENCES bw_or_color (bw_color))
    ENGINE = INNODB;

在此电影表中,“库存”列经常为空,因为我还不知道任何特定电影的电影库存是多少。

我在运行脚本时收到此错误:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`hbm248_BucherFilms1`.`films`, CONSTRAINT `films_ibfk_2` FOREIGN KEY (`stock`) REFERENCES `film_stock` (`stock`))

当它引用的外键没有空值时,我的电影表中是否不允许有空值?我认为在电影表中将“库存”设置为 NULL 将允许空值......或者我是否还需要在电影库存表中将库存设置为 NULL?现在它不是空的...... 或者我是否需要在受控词汇表“股票”中输入“未知”之类的值,然后用这个“未知”值填充电影中的股票列,并在以后确定股票时更改它硝酸盐还是醋酸盐? 最后一个选项似乎可以解决我的问题,但也感觉它应该是不必要的,并且 MySQL 应该有一种方法允许电影表中的空值。

谢谢!

【问题讨论】:

  • film_stock 中的 stock 列会是唯一的吗?
  • 是的(如果我理解你对 unique 的使用,我想是的)
  • 硝酸盐和醋酸盐这两个值只会出现在该列中。
  • 在这种情况下,使列接受空值会破坏唯一性。一种选择是在您的 film_stock 表中创建一个临时占位符。一旦确定了电影的库存价值,您就可以将该记录价值更新为适当的库存信息。旁注:为了使事情更容易,您可能需要添加一个 int 主键并将该值添加到电影中的 stockId 字段。
  • 我想到了临时占位符的想法,但是,我希望不必这样做,因为这看起来像是一堆额外的、不必要的工作。我只想让电影表中的股票接受 NULL 值...

标签: mysql database-design null foreign-keys


【解决方案1】:

子表可以有空值吗?

这在当前的 FK 关系中是不可能的。以下部分将提供有关设置词汇表的指导。

多表词汇表

使用 PK 的 ID 为每个列表创建一个表。然后,此 ID 将用作其他表的 FK。

CREATE TABLE film_stock (
  `ID` int NOT NULL AUTO_INCREMENT,  
  stock varchar (10) NOT NULL,
    PRIMARY KEY(ID))
ENGINE = INNODB;

并为每个列表重复...

单表的替代方式

CREATE TABLE VocabularyList (
  `ID` int NOT NULL AUTO_INCREMENT,  
  groupName varchar (10) NOT NULL,
  groupValue varchar (50) NOT NULL,
  groupOrder int NOT NULL Default 0,
    PRIMARY KEY(ID))
ENGINE = INNODB;

为 VocabularyList 插入语句

insert into VocabularyList(groupName, groupValue, groupOrder) VALUES ('DefaultValue','Pending_Value',1);

insert into VocabularyList(groupName, groupValue, groupOrder) VALUES ('stock','nitrate',1);

insert into VocabularyList(groupName, groupValue, groupOrder) VALUES ('stock','acetate',2);

查询以从 VocabularyList 中检索股票信息

select groupValue
from VocabularyList
where groupName = 'stock'
order by groupOrder

使用单表替代更新电影表

CREATE TABLE films (
    title varchar (100) NOT NULL,
    alternate_title varchar (50) NULL,
    year_of_release varchar (15) NULL,  
    countryID int NOT NULL DEFAULT 1,
    running_time_minutes int (10) NULL,
    footage_lenght_feet int (10) NULL,
    stockID int NOT NULL DEFAULT 1,
    gaugeID int NOT NULL DEFAULT 1,
    bw_colorID int NOT NULL DEFAULT 1,
    notes varchar (255) NULL,
    print_publications varchar (255) NULL,
    existent_print varchar (255) NULL,
    url_1 varchar (100) NULL,
    url_2 varchar (100) NULL,
    url_3 varchar (100) NULL,
    PRIMARY KEY(title),
    FOREIGN KEY(countryID) REFERENCES VocabularyList(ID),
    FOREIGN KEY(stockID) REFERENCES VocabularyList(ID),
    FOREIGN KEY(gaugeID) REFERENCES VocabularyList(ID),
    FOREIGN KEY(bw_colorID) REFERENCES VocabularyList(ID))
    ENGINE = INNODB;

为了方便使用,可以将电影表的主键切换为 int 数据类型。这将确保 PK 的唯一性并减少击键次数。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2015-12-06
    • 1970-01-01
    • 2013-11-17
    • 2018-02-12
    相关资源
    最近更新 更多