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)