Несколько похожих DDL с разным результатом во внешнем ключе - PullRequest
1 голос
/ 23 февраля 2010

Это дальнейшее обсуждение этого вопроса:

Почему все еще можно вставить внешний ключ, который не существует?

Это работает:

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;

Но эти 2 не:

A

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 key совпадает с integer unsigned primary key

Можете ли вы объяснить, почему A и B не работают?

1 Ответ

0 голосов
/ 24 февраля 2010

A не работает, потому что InnoDB не распознает и не поддерживает синтаксис «встроенных справочных спецификаций». Они просто игнорируются.

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;

Источник и дальнейшее чтение:

...