我知道可以将主键内联声明为
CREATE TABLE `my_table` (
`id` INTEGER PRIMARY KEY
);
我怀疑是否可以以相同的方式声明外键,例如
CREATE TABLE `my_table` (
`foreign_id` INTEGER FOREIGN KEY `other_table` (`other_table_id`)
);
答案 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无法识别或支持“内联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