[英]MySQL FK to non-unique field not works
在MySQL手册中,我读到“但是,系统没有强制要求所引用的列为UNIQUE或声明为NOT NULL。” 因此,我尝试创建两个表:
CREATE TABLE album(
id INT,
title VARCHAR(20)) DEFAULT CHARSET=utf8;
CREATE TABLE track2(
album int,
dsk INTEGER,
posn INTEGER,
song VARCHAR(255),
FOREIGN KEY (album) REFERENCES album(id) ) default charset=utf8;
并显示错误:错误1005(HY000):无法创建表'b.track2'(错误号:150)
为什么我不能使用不同于SQL标准但由MySQL提供并在其手册中描述的功能?
我知道该怎么做:
create table album2 (id int, title varchar(20), key (id));
create table track2 (
track_id int primary key,
album_id int not null,
title varchar(100),
foreign key (album_id) references album2 (id)
);
mysql> show create table album2;
+--------+-----------------------------
| Table | Create Table
+--------+-----------------------------
| album2 | CREATE TABLE `album2` (
`id` int(11) DEFAULT NULL,
`title` varchar(20) DEFAULT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+-----------------------------
mysql> show create table track2;
+--------+-----------------------------------------------------------------------
| Table | Create Table
+--------+-----------------------------------------------------------------------
| track2 | CREATE TABLE `track2` (
`track_id` int(11) NOT NULL,
`album_id` int(11) NOT NULL,
`title` varchar(100) DEFAULT NULL,
PRIMARY KEY (`track_id`),
KEY `album_id` (`album_id`),
CONSTRAINT `track2_ibfk_1` FOREIGN KEY (`album_id`) REFERENCES `album2` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+-----------------------------------------------------------------------
我需要做的就是在album2中创建非唯一密钥。
发生这种情况是因为您尚未在album
表中将id
设置为PRIMARY KEY
。
采用
CREATE TABLE album(
id INT PRIMARY KEY,
title VARCHAR(20)) DEFAULT CHARSET=utf8;
CREATE TABLE track2(
album int,
dsk INTEGER,
posn INTEGER,
song VARCHAR(255),
FOREIGN KEY (album) REFERENCES album(id) ) default charset=utf8;
请阅读
我相信 ,您的引擎是MyISAM。 根据MYSQL手册 ,您的声明对InnoDB有效,对MyISAM不适用。
另外,MySQL和InnoDB要求对引用的列进行索引以提高性能。 但是,系统不强制要求引用的列为UNIQUE或声明为NOT NULL。 对于诸如UPDATE或DELETE CASCADE之类的操作,未很好地定义对非唯一键或包含NULL值的键的外键引用的处理。 建议您使用仅引用UNIQUE和NOT NULL键的外键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.