【问题标题】:Foreign key constraints missing from SHOW CREATE TABLE outputSHOW CREATE TABLE 输出中缺少外键约束
【发布时间】:2011-05-31 17:06:55
【问题描述】:

我发现SHOW CREATE TABLE 没有像我预期的那样显示外键约束。

为了演示,这里有一个来自MySQL manual的例子:

CREATE TABLE parent (
  id INT NOT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (
  id INT, parent_id INT,
  INDEX par_ind (parent_id),
  FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;

mysql> SHOW CREATE TABLE child\G
*************************** 1. row ***************************
       Table: child
Create Table: CREATE TABLE "child" (
  "id" int(11) default NULL,
  "parent_id" int(11) default NULL,
  KEY "par_ind" ("parent_id")
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

在该输出中,我希望看到类似的内容:

CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`)
REFERENCES `parent` (`id`) ON DELETE CASCADE

在那个创建表输出中,但显然它不存在。

然而,约束似乎确实存在:

mysql> SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE table_schema=database()\G
*************************** 1. row ***************************
           CONSTRAINT_CATALOG: NULL
            CONSTRAINT_SCHEMA: test_fk
              CONSTRAINT_NAME: child_ibfk_1
                TABLE_CATALOG: NULL
                 TABLE_SCHEMA: test_fk
                   TABLE_NAME: child
                  COLUMN_NAME: parent_id
             ORDINAL_POSITION: 1
POSITION_IN_UNIQUE_CONSTRAINT: 1
      REFERENCED_TABLE_SCHEMA: test_fk
        REFERENCED_TABLE_NAME: parent
       REFERENCED_COLUMN_NAME: id
*************************** 2. row ***************************
           CONSTRAINT_CATALOG: NULL
            CONSTRAINT_SCHEMA: test_fk
              CONSTRAINT_NAME: PRIMARY
                TABLE_CATALOG: NULL
                 TABLE_SCHEMA: test_fk
                   TABLE_NAME: parent
                  COLUMN_NAME: id
             ORDINAL_POSITION: 1
POSITION_IN_UNIQUE_CONSTRAINT: NULL
      REFERENCED_TABLE_SCHEMA: NULL
        REFERENCED_TABLE_NAME: NULL
       REFERENCED_COLUMN_NAME: NULL
2 rows in set (0.01 sec)

mysql> SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE table_schema=database()\G
*************************** 1. row ***************************
CONSTRAINT_CATALOG: NULL
 CONSTRAINT_SCHEMA: test_fk
   CONSTRAINT_NAME: child_ibfk_1
      TABLE_SCHEMA: test_fk
        TABLE_NAME: child
   CONSTRAINT_TYPE: FOREIGN KEY
*************************** 2. row ***************************
CONSTRAINT_CATALOG: NULL
 CONSTRAINT_SCHEMA: test_fk
   CONSTRAINT_NAME: PRIMARY
      TABLE_SCHEMA: test_fk
        TABLE_NAME: parent
   CONSTRAINT_TYPE: PRIMARY KEY
2 rows in set (0.01 sec)

通过我自己的设计示例,我得到了相同的结果。

知道发生了什么吗?


UPDATE 2011-01-08:我认为这与 sql_mode 变量有关。但目前我不知道哪种模式设置排除了 SHOW CREATE TABLE 输出中的约束。

【问题讨论】:

  • 约束对我来说很好。您使用的是哪个MySQL 版本?您在创建表格时没有收到错误消息吗?

标签: mysql


【解决方案1】:

mysql sql_mode 变量的设置绝对是我报告的行为的原因。我从 my.cnf 中删除了设置它的行,mysql 执行了预期的行为。但是我忘记了那个设置是什么,从那以后就没有弄清楚。如果有人能确定哪个,请继续。

【讨论】:

    【解决方案2】:

    不幸的是,我无法按我的意愿发表评论,所以听到你的问题的答案很弱。 . .

    这个命令有效!创建表时尝试使用以下方法实现外键: 约束和名称/id!

    CONSTRAINT 'child_fk1' 外键 ('parent_id') REFERENCES parent('id')

    可能有帮助,否则在线检查oracle mysql语法对应于您的服务器版本!

    http://dev.mysql.com/doc/refman/5.0/en/create-table.html 问候

    【讨论】:

    • 刚开始创建表格时,只需正确设置 constarint !
    【解决方案3】:

    对于发现此问题的任何人,此查询将有所帮助:

    SELECT tb1.CONSTRAINT_NAME, tb1.TABLE_NAME, tb1.COLUMN_NAME,
    tb1.REFERENCED_TABLE_NAME, tb1.REFERENCED_COLUMN_NAME, tb2.MATCH_OPTION,
    tb2.UPDATE_RULE, tb2.DELETE_RULE
    FROM information_schema.`KEY_COLUMN_USAGE` AS tb1
    INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS tb2
    ON tb1.CONSTRAINT_NAME = tb2.CONSTRAINT_NAME
    WHERE table_schema = '{DATABASE_NAME}'
    AND referenced_column_name IS NOT NULL
    

    原文取自:here

    不幸的是,更改 'my.cnf' 中的 'sql_mode' 对以下输出没有任何影响:

    SHOW CREATE TABLE {TABLE_NAME};
    

    它仍然没有显示“ON DELETE”限制。在 Mac OS X 10.9 上使用 MySQL 5.6.22 版。

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2018-12-12
      • 2014-12-07
      相关资源
      最近更新 更多