首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL InnoDB外键要求(索引/唯一/主)

问MySQL InnoDB外键要求(索引/唯一/主)
EN

Database Administration用户
提问于 2022-12-03 03:10:15
回答 1查看 229关注 0票数 2

MySQL 5.6博士对外键设置了某些条件和限制:

InnoDB允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列是相同顺序的第一列。InnoDB添加到索引中的隐藏列也会被考虑(参见14.6.2.1节,“聚集索引和辅助索引”)。NDB需要在作为外键引用的任何列上显式的唯一键(或主键)。InnoDB没有,这是标准SQL的扩展。

我使用了代码示例并做了一些更改:从产品的主键中删除类别,并且只引用product_order表中的类别:

代码语言:javascript
复制
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中,此代码将获得不同的输出:

  • 5.7.34:ERROR 1215 (HY000): Cannot add foreign key constraint
  • 8.0.27:ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'product_order_ibfk_1' in the referenced table 'product'
  • 8.0.30:没有错误,product_order创建了

我查看了发布说明,但无法精确地指出使代码能够正常工作的更改。MySQL 8.0医生有一个类似的语句无法解释这一点:

InnoDB允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列是相同顺序的第一列。InnoDB添加到索引中的隐藏列也会被考虑(参见15.6.2.1节,“聚集索引和辅助索引”)。NDB需要在作为外键引用的任何列上显式的唯一键(或主键)。InnoDB没有,这是标准SQL的扩展。

我想知道我在3种环境中的测试是否可以被复制。如果是的话,8.0.30's传递密码的原因是什么?谢谢!

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-12-03 08:06:34

8.0.30:没有错误,product_order创建了

我在MySQL版本8.0.30上进行了测试,但是创建表product_order失败了。

在下面的测试:

代码语言:javascript
复制
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'

在这把小提琴中,没有创建表。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/320514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档