MYSQL:如何声明外键内联?

时间:2014-06-19 17:47:47

标签: mysql foreign-key-relationship

我知道可以将主键内联声明为

CREATE TABLE `my_table` (
    `id` INTEGER PRIMARY KEY
);

我怀疑是否可以以相同的方式声明外键,例如

CREATE TABLE `my_table` (
   `foreign_id` INTEGER FOREIGN KEY `other_table` (`other_table_id`)
);

3 个答案:

答案 0 :(得分:3)

截至今天(2020年2月),类似以下的代码将在例如MariaDB(10.3.18-MariaDB-0+deb10u1):

DROP SCHEMA IF EXISTS TABLE_TEST;
CREATE SCHEMA TABLE_TEST;
USE TABLE_TEST;
CREATE TABLE TABLE_TESTA(
    id INT PRIMARY KEY
);

CREATE TABLE TABLE_TESTB(
    fk INT REFERENCES TABLE_TESTA(id)
);

您将使用的语法

AttributeName AttributeType REFERENCES TableName(AttributeName)

CREATE语句中。

不会创建外键。 您可以通过执行

自己查看
INSERT INTO TABLE_TESTB VALUES (2);

甚至

SHOW CREATE TABLE TABLE_TESTB;

返回

+-------------+--------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                     |
+-------------+--------------------------------------------------------------------------------------------------+
| TABLE_TESTB | CREATE TABLE `TABLE_TESTB` (
  `fk` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------------+--------------------------------------------------------------------------------------------------+

因此,您可以内联“声明”外键,它将被解析,但不会被执行!

This is a bug已被记录了很长时间,但从未解决。

答案 1 :(得分:2)

来自MySQL documentation

  

MySQL无法识别或支持“内联REFERENCES规范”(在SQL标准中定义),其中引用被定义为列规范的一部分。 MySQL仅在指定为单独的FOREIGN KEY规范的一部分时才接受REFERENCES子句。

答案 2 :(得分:0)

ALTER TABLE things ADD COLUMN `stuff_id` int(11) DEFAULT NULL, ADD CONSTRAINT `stuff_id_fk` FOREIGN KEY (`stuff_id`) REFERENCES `other_table` (`id`) ON DELETE SET NULL