MySQL外键陷阱

2200阅读 0评论2016-03-24 skykiker
分类:Mysql/postgreSQL

今天发现按照标准SQL写法在MySQL建表时创建的外键都没有生效 ,调查发现MySQL居然没有创建外键(使用的是最新的MySQL 5.7)。

  1. mysql> create table tbp(id int,pid int REFERENCES tb(id) on delete RESTRICT);
  2. Query OK, 0 rows affected (0.05 sec)

  3. mysql> show create table tbp;
  4. +-------+-----------------------------------------------------------------------------------------------------------------------+
  5. | Table | Create Table |
  6. +-------+-----------------------------------------------------------------------------------------------------------------------+
  7. | tbp | CREATE TABLE `tbp` (
  8.   `id` int(11) DEFAULT NULL,
  9.   `pid` int(11) DEFAULT NULL
  10. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  11. +-------+-----------------------------------------------------------------------------------------------------------------------+
  12. 1 row in set (0.00 sec)

换一种写法可以成功
  1. mysql> create table tbp2(id int,pid int, FOREIGN KEY (pid) REFERENCES tb(id) on delete RESTRICT);
  2. Query OK, 0 rows affected (0.04 sec)

  3. mysql> show create table tbp2;
  4. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | Table | Create Table |
  6. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  7. | tbp2 | CREATE TABLE `tbp2` (
  8.   `id` int(11) DEFAULT NULL,
  9.   `pid` int(11) DEFAULT NULL,
  10.   KEY `pid` (`pid`),
  11.   CONSTRAINT `tbp2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `tb` (`id`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  13. +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  14. 1 row in set (0.00 sec)

这也太坑了,不支持就应该报个错啊!
                                  
上一篇:MySQL rpl_semi_sync_master_timeout相关的一件BUG
下一篇:CTE(Common Table Expressions)的用法二例