MYSQL:如何内联声明外键?

alb*_*ert 3 mysql foreign-key-relationship

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

CREATE TABLE `my_table` (
    `id` INTEGER PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)

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

CREATE TABLE `my_table` (
   `foreign_id` INTEGER FOREIGN KEY `other_table` (`other_table_id`)
);
Run Code Online (Sandbox Code Playgroud)

jul*_*enc 6

来自MySQL 文档

\n\n
\n

MySQL 不识别或支持 \xe2\x80\x9cinline REFERENCES 规范\xe2\x80\x9d (如 SQL 标准中定义),其中引用被定义为列规范的一部分。仅当指定为单独的 FOREIGN KEY 规范的一部分时,MySQL 才接受 REFERENCES 子句。

\n
\n


Clé*_*ent 5

截至今天(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)
);
Run Code Online (Sandbox Code Playgroud)

您将使用的语法是

AttributeName AttributeType REFERENCES TableName(AttributeName)
Run Code Online (Sandbox Code Playgroud)

CREATE声明中。

但是不会创建外键。您可以通过执行自己查看

INSERT INTO TABLE_TESTB VALUES (2);
Run Code Online (Sandbox Code Playgroud)

甚至

SHOW CREATE TABLE TABLE_TESTB;
Run Code Online (Sandbox Code Playgroud)

返回

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

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

这是一个已经记录了很长时间但从未解决的错误。

  • 在 MariaDB 5.0 (https://jira.mariadb.org/browse/MDEV-20729) 中已修复,但在 MySQL 中未修复。 (2认同)