我发现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)
我通过自己设计的例子得到了相同的结果。
知道发生了什么事吗?
更新2011-01-08 :我认为这与sql_mode变量有关。但目前我不知道哪种模式设置排除了SHOW CREATE TABLE输出的约束。
答案 0 :(得分:1)
mysql sql_mode变量的设置肯定是我报告的行为的原因。我删除了从my.cnf设置它的行,mysql执行了预期的行为。但是我忘记了那个设置是什么,并且从那时起就没有弄明白。如果有人能够确定哪一个,请继续前进。
答案 1 :(得分:0)
不幸的是我无法发表评论,所以听到你的问题的答案很简单。 。
此命令有效!在创建表时尝试使用以下方法实现外键: 约束和名称/ ID!
CONSTRAINT'child_fk1'FOREIGN KEY ('parent_id')REFERENCES parent('id')
可能有帮助,否则检查oracle mysql语法在线对应你的服务器版本!!
答案 2 :(得分:0)
对于发现此问题的任何人,此查询都会有所帮助:
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
不幸的是改变了#sql_mode'在my.cnf'没有对输出产生任何影响:
SHOW CREATE TABLE {TABLE_NAME};
它仍然没有显示' ON DELETE'限制。在Mac OS X 10.9上使用MySQL版本5.6.22。