【问题标题】:MySQL - can't define foreign keyMySQL - 无法定义外键
【发布时间】: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 子句。

标签: python mysql phpmyadmin foreign-keys wamp


【解决方案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 会自动创建索引。)
    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2013-02-26
    • 2013-10-05
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2016-03-01
    相关资源
    最近更新 更多