1

在 MySQL 手册中,我读到“但是,系统不强制要求引用的列必须是唯一的或声明为 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;

并有错误:ERROR 1005 (HY000): Can't create table 'b.track2' (errno: 150)

为什么我不能使用偏离 SQL 标准但由 MySQL 提供并在其手册中描述的功能?

4

2 回答 2

1

我明白该怎么做:

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

我只需要在专辑 2 中创建非唯一键。

于 2012-06-21T03:32:35.240 回答
0

id发生这种情况是因为您没有PRIMARY KEYalbum表格中设置。

利用

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;

演示


更新 1

请阅读

外键可以引用非唯一索引吗?

非唯一键的Mysql外键——这怎么可能?


更新 2

我相信,您的引擎是 MyISAM。根据MYSQL 手册,您的语句适用于 InnoDB 而不是 MyISAM。

此外,MySQL 和 InnoDB 要求对引用的列进行索引以提高性能。但是,系统不强制要求引用的列必须是 UNIQUE 或声明为 NOT NULL。对于 UPDATE 或 DELETE CASCADE 等操作,对非唯一键或包含 NULL 值的键的外键引用的处理没有明确定义。建议您使用仅引用 UNIQUE 和 NOT NULL 键的外键。

于 2012-06-20T15:33:04.567 回答