MySQL - 无法定义外键

Posted

技术标签:

【中文标题】MySQL - 无法定义外键【英文标题】:MySQL - can't define foreign key 【发布时间】:2015-04-16 05:26:01 【问题描述】:

我正在尝试使用 Python 在 Wamp 服务器上创建表。有两个表 - 人和消息。表消息有一个列 person_id,它应该是表 person 的外键。

创建表后,通过 phpMyAdmin 查看消息表中没有外键。 SQL查询有问题吗?

人的创造:

@staticmethod
def createTablePerson():
    return "CREATE TABLE IF NOT EXISTS person (" \
           "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY," \
           "name VARCHAR(100)," \
           "surname VARCHAR(100)" \
           ");"

消息的创建:

@staticmethod
def createTableMessage():
    return "CREATE TABLE IF NOT EXISTS message (" \
           "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY," \
           "personID INT NOT NULL REFERENCES person (id)," \
           "text VARCHAR(1000)" \
           ");"

【问题讨论】:

您能否检查一下您的表引擎,因为 MyISAM 表的外键未实现并被静默忽略,并且仅适用于 InnoDB 表。 mysql 解析但忽略“内联引用规范”(如 SQL 标准中所定义),其中引用被定义为列规范的一部分。当指定为单独的 FOREIGN KEY 规范的一部分时,MySQL接受 REFERENCES 子句。 【参考方案1】:

MySQL 解析但忽略“内联 REFERENCES 规范”(如 SQL 标准中所定义),其中引用被定义为列规范的一部分。 MySQL 仅在指定为单独的 FOREIGN KEY 规范的一部分时才接受 REFERENCES 子句。

参考:http://dev.mysql.com/doc/refman/5.5/en/create-table.html


因此,要添加外键约束(对于支持它们的存储引擎),外键必须与列分开定义。

这样,REFERENCES 子句将被忽略:

personID INT NOT NULL REFERENCES person (id),

要让 MySQL 添加外键约束,可以这样:

personID INT NOT NULL, 
...
FOREIGN KEY (personID) REFERENCES person (id),
...

【讨论】:

【参考方案2】:

在添加为外键之前,您需要 index 列。命令应该是

CREATE TABLE IF NOT EXISTS person (
           id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
           name VARCHAR(100),
           surname VARCHAR(100)
  );

CREATE TABLE IF NOT EXISTS message (
           id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
           text VARCHAR(1000),
           personID INT NOT NULL,
           INDEX personid_idx (personID),
           FOREIGN KEY (personID)  REFERENCES person (id)

           );

【讨论】:

引用表列上的唯一键或主键就足够了。 此语法将起作用,因为 REFERENCES 子句是单独的 FOREIGN KEY 定义的一部分。但是不需要在列上添加 INDEX 或 KEY 来定义外键。 (如果合适的索引尚不存在,InnoDB 会自动创建索引。)

以上是关于MySQL - 无法定义外键的主要内容,如果未能解决你的问题,请参考以下文章

一般错误:1215 无法添加外键约束,Laravel 5 & MySQL

如何在 MySQL 和 phpMyAdmin 的两个不同数据库中定义外键

使用 mysql 工作台创建 CHAR 类型的外键时出错:错误 1005:无法创建表(错误号:150)

Oracle定义约束外键约束

Magento DB错误:完整性约束违规:1452无法添加或更新子行:外键约束失败

外键和 MySQL 错误