外键约束。 child table 可以有空值吗?错误 1452 (23000)

foreign key constraints. can child table have null values? ERROR 1452 (23000)

我有一个受控词汇表 table 设置如下:

-- 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' - 硝酸盐和醋酸盐。

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

-- 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;

在这部电影中 table 列 'stock' 经常是空的,因为我还不知道任何特定电影的胶片库存是多少。

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

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`))

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

中的空值

谢谢!

Can child table have null values?

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

多表词汇表

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

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

and repeat for each list...

单一 table

的另一种方式
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;

为词汇表插入语句

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

更新电影 table 使用单一 table 替代

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;

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