gpt4 book ai didi

mysql - 采购 MySQL 代码时出现错误 1215 和 1146

转载 作者:可可西里 更新时间:2023-11-01 08:34:59 26 4
gpt4 key购买 nike

我正在阅读 O'Reilly 出版的“Learning MySQL”一书,我正在尝试获取本书网站上发布的以下 SQL 代码:

DROP DATABASE IF EXISTS music;
CREATE DATABASE music;
USE music;

CREATE TABLE artist (
artist_id SMALLINT(5) NOT NULL DEFAULT 0,
artist_name CHAR(128) DEFAULT NULL,
PRIMARY KEY (artist_id)
);

CREATE TABLE album (
artist_id SMALLINT(5) NOT NULL DEFAULT 0,
album_id SMALLINT(4) NOT NULL DEFAULT 0,
album_name CHAR(128) DEFAULT NULL,
PRIMARY KEY (artist_id,album_id),
FOREIGN KEY (artist_id) REFERENCES artist(artist_id)
);

CREATE TABLE track (
track_id SMALLINT(3) NOT NULL DEFAULT 0,
track_name CHAR(128) DEFAULT NULL,
artist_id SMALLINT(5) NOT NULL DEFAULT 0,
album_id SMALLINT(4) NOT NULL DEFAULT 0,
time DECIMAL(5,2) DEFAULT NULL,
PRIMARY KEY (artist_id,album_id,track_id),
FOREIGN KEY (artist_id) REFERENCES artist(artist_id),
FOREIGN KEY (album_id) REFERENCES album(album_id)
);

CREATE TABLE played (
artist_id SMALLINT(5) NOT NULL DEFAULT 0,
album_id SMALLINT(4) NOT NULL DEFAULT 0,
track_id SMALLINT(3) NOT NULL DEFAULT 0,
played TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (artist_id,album_id,track_id,played),
FOREIGN KEY (artist_id) REFERENCES artist(artist_id),
FOREIGN KEY (album_id) REFERENCES album(album_id),
FOREIGN KEY (track_id) REFERENCES track(track_id)
);

-- And the whole bunch of data input into those tables.
INSERT INTO played VALUES (1, 3, 0, "20060814102103");
INSERT INTO artist VALUES (1, "New Order");
INSERT INTO album VALUES (2, 1, "Let Love In");
INSERT INTO track VALUES (0,'Do You Love Me?',2,1,'5.95');

但是,当我尝试 SOURCE 时,MySQL 提示我 ERROR 1215 (HY000): Cannot add foreign key constraint错误 1146 (42s02):表“music.track”不存在。我已经考虑了一段时间了。似乎出了什么问题?

最佳答案

您的外键必须引用整个候选键。

CREATE TABLE track (
track_id SMALLINT(3) NOT NULL DEFAULT 0,
track_name CHAR(128) DEFAULT NULL,
artist_id SMALLINT(5) NOT NULL DEFAULT 0,
album_id SMALLINT(4) NOT NULL DEFAULT 0,
time DECIMAL(5,2) DEFAULT NULL,
PRIMARY KEY (artist_id,album_id,track_id),
FOREIGN KEY (artist_id) REFERENCES artist(artist_id),
/* This won't work, not referencing an entire key: */
/*FOREIGN KEY (album_id) REFERENCES album(album_id)*/
/* This should work: */
FOREIGN KEY (artist_id,album_id) REFERENCES album(artist_id,album_id)
);

您必须在玩牌 table 上进行类似的更改。

Here is a SqlFiddle这些更改的一部分,包括以正确的顺序插入数据,并使用现有的键值。

还有一种想法是,如果 album_id 是它自己的候选键(它是唯一的),那么只需将其设为 album 的主键即可。您不需要在 track 中包含 artist_id 列,然后,如您所知,trackartist > 专辑。您也可以将其应用于其他子表(已播放)。

当然,如果您使用 track_id 作为 album 的序号(它不是唯一的,每个 album 可能都有一个 track_id = 1),那么你应该坚持你的复合键,或者使用其他唯一约束来制作代理键。

主键的默认值也令人费解,因为它们只适用于第一次插入。

关于mysql - 采购 MySQL 代码时出现错误 1215 和 1146,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com