Ошибка таблицы не существует при добавлении внешнего ключа в существующую таблицу - PullRequest
0 голосов
/ 12 февраля 2020

Я добавляю внешний ключ к столбцу в таблице в mySQL DB:

 ALTER TABLE Orders ADD CONSTRAINT FK_ProjectNumber FOREIGN KEY (porj) REFERENCES proj(projno);

Таблица с существующим столбцом - emp, столбец в emp - porj и внешний ключ находится в таблице proj, столбец projno. Однако я получаю следующую ошибку:

1146 - Table 'empdept.orders' doesn't exist

Я не понимаю ссылку на empdept.orders, empdept не является таблицей и не 'заказывает' столбец в любой существующей таблице в БД, так почему это было упомянуто?

Любой вклад приветствуется.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Ошибка ссылается на полное имя таблицы, то есть имя вашей схемы emptdept, а имя таблицы Orders.

Я могу воспроизвести эту ошибку на MySQL 8.0, если таблица Orders это MyISAM (или что-то другое, кроме InnoDB, я полагаю).

mysql> CREATE TABLE `proj` (
    ->   `projno` int(11) NOT NULL,
    ->   PRIMARY KEY (`projno`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
mysql> CREATE TABLE `orders` (
    ->   `porj` int(11) DEFAULT NULL
    -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

mysql> ALTER TABLE Orders ADD CONSTRAINT FK_ProjectNumber FOREIGN KEY (porj) REFERENCES proj(projno);
ERROR 1146 (42S02): Table 'test.Orders' doesn't exist

Таблицы MyISAM не поддерживают ограничения внешнего ключа.

Жаль, что сообщение об ошибке так неясно. Таблица существует, но ее нет в словаре данных InnoDB. Я думаю, это их аргументация.

Я не вижу той же ошибки в MySQL 5.7, вместо этого я получаю следующий результат:

Query OK, 0 rows affected (0.02 sec)

Когда вы пытаетесь создать внешний ключ на в таблице MyISAM в MySQL 5.7 операция незаметно игнорируется. Это не вызывает никаких ошибок, оно просто не делает этого.

С новой реализацией словаря данных InnoDB в MySQL 8.0 они, наконец, выдают ошибку, вместо того, чтобы молча принять ALTER TABLE для неподдерживаемая функция.

Кстати, я рекомендую вам больше не использовать таблицы MyISAM. Они постепенно устаревают.

0 голосов
/ 12 февраля 2020

Я забыл установить первичный ключ в ссылочной таблице, теперь решен:

create table proj (projno numeric(3,0) not null, pname char(5), budget numeric (7,2, PRIMARY KEY (projno)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...