MySQL 5.6博士对外键设置了某些条件和限制:
InnoDB允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列是相同顺序的第一列。InnoDB添加到索引中的隐藏列也会被考虑(参见14.6.2.1节,“聚集索引和辅助索引”)。NDB需要在作为外键引用的任何列上显式的唯一键(或主键)。InnoDB没有,这是标准SQL的扩展。
我使用了代码示例并做了一些更改:从产品的主键中删除类别,并且只引用product_order表中的类别:
CREATE TABLE product (
category INT NOT NULL,
id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(id)
);
CREATE TABLE customer (
id INT NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE product_order (
no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
FOREIGN KEY (product_category)
REFERENCES product(category)
ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (customer_id)
REFERENCES customer(id)
);在不同版本的MySQL中,此代码将获得不同的输出:
ERROR 1215 (HY000): Cannot add foreign key constraintERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'product_order_ibfk_1' in the referenced table 'product'我查看了发布说明,但无法精确地指出使代码能够正常工作的更改。MySQL 8.0医生有一个类似的语句无法解释这一点:
InnoDB允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列是相同顺序的第一列。InnoDB添加到索引中的隐藏列也会被考虑(参见15.6.2.1节,“聚集索引和辅助索引”)。NDB需要在作为外键引用的任何列上显式的唯一键(或主键)。InnoDB没有,这是标准SQL的扩展。
我想知道我在3种环境中的测试是否可以被复制。如果是的话,8.0.30's传递密码的原因是什么?谢谢!
发布于 2022-12-03 08:06:34
8.0.30:没有错误,product_order创建了
我在MySQL版本8.0.30上进行了测试,但是创建表product_order失败了。
在下面的测试:
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.30 |
+-----------+
1 row in set (0.00 sec)
mysql> CREATE TABLE product (
-> category INT NOT NULL,
-> id INT NOT NULL,
-> price DECIMAL,
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.11 sec)
mysql>
mysql> CREATE TABLE customer (
-> id INT NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> CREATE TABLE product_order (
-> no INT NOT NULL AUTO_INCREMENT,
-> product_category INT NOT NULL,
-> product_id INT NOT NULL,
-> customer_id INT NOT NULL,
->
-> PRIMARY KEY(no),
->
-> FOREIGN KEY (product_category)
-> REFERENCES product(category)
-> ON UPDATE CASCADE ON DELETE RESTRICT,
->
-> FOREIGN KEY (customer_id)
-> REFERENCES customer(id)
-> );
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'product_order_ibfk_1' in the referenced table 'product'在这把小提琴中,没有创建表。
https://dba.stackexchange.com/questions/320514
复制相似问题