【发布时间】: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