gpt4 book ai didi

mysql - 几个相似的 DDL 在外键中有不同的结果

转载 作者:行者123 更新时间:2023-11-30 23:41:52 24 4
gpt4 key购买 nike

这是对这个问题的进一步讨论:

Why is it still possible to insert a foreign key that doesn't exist?

这个有效:

CREATE TABLE products (
id integer unsigned auto_increment primary key
) ENGINE=INNODB;

CREATE TABLE orders (
id integer PRIMARY KEY auto_increment,
product_id integer unsigned,
quantity integer,
INDEX product_id_idx (product_id),
FOREIGN KEY (product_id) REFERENCES products (id)
) ENGINE=INNODB;

但这两个不是:

一个

CREATE TABLE products (
id integer unsigned auto_increment primary key
) ENGINE=INNODB;

CREATE TABLE orders (
id integer PRIMARY KEY auto_increment,
product_id integer unsigned REFERENCES products (id),
quantity integer,
INDEX product_id_idx (product_id)
);

B

CREATE TABLE products (
id integer auto_increment primary key
) ENGINE=INNODB;

CREATE TABLE orders (
id integer PRIMARY KEY auto_increment,
product_id integer unsigned,
quantity integer,
INDEX product_id_idx (product_id),
FOREIGN KEY (product_id) REFERENCES products (id)
) ENGINE=INNODB;

对于B,是因为integer primary keyinteger unsigned primary key相同

你能解释一下为什么 AB 不起作用吗?

最佳答案

A 不起作用,因为 InnoDB 不识别或不支持“Inline REFERENCES specifications”的语法。他们只是被忽略了。

B 不起作用,因为引用列和被引用列的类型必须完全相同。 “整数类型的大小和符号必须相同。” MySQL 的数字数据类型默认是signed,因此您必须显式指定unsigned 属性。您可以测试 INT AUTO_INCREMENT PRIMARY KEY 并不意味着 unsigned:

CREATE TABLE a (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=INNODB;
INSERT INTO a VALUES(-5);
SELECT * FROM a;

来源和进一步阅读:

关于mysql - 几个相似的 DDL 在外键中有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com