2010-10-25 3 views
0

У меня есть две таблицы:MySQL простая проблема с внешними ключами

Таблица Автор: ID (INTEGER), AUTHOR_NAME и (VARCHAR), First_name (VARCHAR), last_name (VARCHAR), preferred_name (VARCHAR) ,

Таблица соавторстве: ID (INTEGER) author1ID (INTEGER), author2ID (INTEGER), paper_ID (INTEGER) (идентификатор соавторстве бумаги, на который ссылается этой ссылке)

Я хочу добавить внешние ограничения ключа, так что author1ID и author2ID в CoAuthored относятся к ID в Author. Я определил таблицы как таковые:

CREATE TABLE Author(ID INT, author_name VARCHAR(100), preferred_name VARCHAR(100), first_name VARCHAR(100), last_name VARCHAR(100), PRIMARY KEY(ID)) ENGINE=INNODB; 

CREATE TABLE CoAuthored(ID INT, author1ID INT, author2ID INT, paper_ID INT); 

Это моя попытка создать внешний ключ:

ALTER TABLE CoAuthored ADD foreign key (author1ID) references Author(ID) on delete cascade on update cascade; 

Это выполняется нормально, но когда я пытаюсь добавить аа кортеж, который содержит author1ID, что Безразлично 't существует в ID, это позволяет мне это сделать, то есть ограничение внешнего ключа не работает.

Что мне нужно сделать по-другому? Я попытался сделать обе таблицы ENGINE = INNODB в операторах create, но тогда я бы получил ERROR 1005, не смог создать таблицу.

+0

Сделать идентификатор в качестве первичного ключа в таблице Authod. –

ответ

0

от: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6035435.html

Для того, чтобы установить связь по внешнему ключу между двумя таблицами MySQL, должны быть выполнены три условия:

  1. Обе таблицы должны иметь тип InnoDB таблицы.

  2. Поля, используемые во внешнем ключе, должны быть проиндексированы.

  3. Поля, используемые в отношении внешнего ключа, должны быть похожими по типу данных.

Важно: Для не InnoDB таблиц, то FOREIGN KEY условие игнорируется.

+0

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

+0

, который определенно сделает трюк :) – clyc

0

Вы можете попробовать 'ENGINE = InnoDB'

Ограничения внешнего ключа/Основные ограничения работы с таблицами InnoDB только :)

--Cheers

0

Прежде всего: Вы должны определить все таблицы с иностранными ключами - InnoDB. MyISAM просто не поддерживает внешние ключи.

Ваша проблема здесь (ошибка 1005) немного запутанна. Если вы делаете ALTER TABLE, это означает, что в одном из полей внешнего ключа есть значение, которое не имеет ссылки в другой таблице.

При создании таблиц убедитесь, что вы сначала создаете «родительскую» таблицу, затем вторую и третью таблицу.

Смежные вопросы