Ошибка создания внешнего ключа (проверьте типы данных)

Я пытаюсь создать связь между двумя таблицами. А вот запрос для каждой таблицы и создание внешнего ключа,

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.

Это не проливает света на то, почему возникает ошибка, но решает проблему.

Удачи.

Другие вопросы по тегам