Ошибка создания внешнего ключа (проверьте типы данных)
Я пытаюсь создать связь между двумя таблицами. А вот запрос для каждой таблицы и создание внешнего ключа,
CREATE TABLE IF NOT EXISTS `quotes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`quote` text COLLATE utf8_unicode_ci NOT NULL,
`author` int(11) NOT NULL,
`topic` int(11) NOT NULL,
`language` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `author` (`author`),
KEY `topic` (`topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE IF NOT EXISTS `authors` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`author` int(11) NOT NULL,
`period` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`photo` text COLLATE utf8_unicode_ci NOT NULL,
`references` text COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `author` (`author`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
ALTER TABLE `quotes` ADD FOREIGN KEY ( `author` ) REFERENCES `mytestdb`.`authors` (
`id`
) ON DELETE RESTRICT ON UPDATE RESTRICT ;
Но это бросает следующую ошибку,
Error creating foreign key on author (check data types)
Я не уверен, о чем эта ошибка. Любая помощь по этому вопросу будет принята с благодарностью.
2 ответа
Типы данных и знаки должны быть одинаковыми
int
это не то же самое, что unsigned int
ширина экрана не имеет значения
author
является подписанным Int
id
является неподписанным Int
Соответствующие столбцы во внешнем ключе и ссылочном ключе должны иметь одинаковые типы данных. Размер и знак целочисленных типов должны быть одинаковыми. Длина типов строк не обязательно должна быть одинаковой. Для недвоичных (символьных) строковых столбцов набор символов и параметры сортировки должны быть одинаковыми.
Они имеют одинаковый размер (int). Они не одного знака.
Ширина отображения 10 и 11 не имеет значения.
демонстрация
create table referenced
( id int(11) primary key
);
create table referencing
( id int primary key,
author int(10) not null,
CONSTRAINT fk_blah FOREIGN KEY (author) REFERENCES referenced(id)
);
работает без проблем
CREATE TABLE IF NOT EXISTS `quotes` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`quote` text COLLATE utf8_unicode_ci NOT NULL,
`author` int(11) NOT NULL,
`topic` int(11) NOT NULL,
`language` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `author` (`author`),
KEY `topic` (`topic`)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `authors` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`author` int(11) NOT NULL,
`period` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`photo` text COLLATE utf8_unicode_ci NOT NULL,
`references` text COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `author` (`author`),
CONSTRAINT fk_blah222 FOREIGN KEY (author) REFERENCES quotes(id)
) ENGINE=InnoDB;
работает без проблем
Для полноты.
Я обнаружил, что добавление внешнего ключа в качестве изменения в существующую таблицу также вызывает эту ошибку.
Используя PHPMyAdmin, мне пришлось удалить таблицу, а затем воссоздать ее с помощью внешнего ключа. После создания таблицы мне пришлось добавить ограничение внешнего ключа, используя «представление отношения» таблицы в PHPMyAdmin.
Это не проливает света на то, почему возникает ошибка, но решает проблему.
Удачи.