2012-01-24 1 views
7

Я пытаюсь создать базу данных, которая имеет 2 таблицы с взаимозависимыми внешними ключами.mysql - Взаимозависимые внешние ключи

Первая таблица называется вопросами, она содержит данные по вопросам, задаваемым пользователями, а также должна содержать ключ к лучшему ответу, на который был дан ответ на вопрос. (Это должен быть внешний ключ для нашей второй таблицы под названием «Ответ»)

Вторая таблица называется «Ответ», она содержит информацию относительно ответов на вопросы, а также должна содержать поле question_id, что является ключом к вопросу о том, что этот ответ отвечает. это также внешний ключ, к первой таблице.

Когда я пытаюсь создать таблицы, он не может создать первый, так как он не знает о втором (ошибка при попытке объявить внешний ключ ко второй таблице, которая еще не существует)

Вот код, я использую:

create table question 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id) references answer(a_id), 
); 


create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

Как я решить эту проблему? Thanks

+1

См. Мой ответ в аналогичном вопросе: [Каков наилучший способ вставки строк в таблицы со ссылками от 1 до 1 друг друга?] (Http://stackoverflow.com/questions/6691366/mysql-database-design -inerting-rows-in-1to1-tables/6692054 # 6692054) –

ответ

4

Создайте первую таблицу без ограничения внешнего ключа. Затем создайте вторую таблицу как есть. Наконец, вернитесь назад и измените первую таблицу, добавив ограничение внешнего ключа отдельно.

И SQL, чтобы добавить внешний ключ будет выглядеть следующим образом:

ALTER TABLE question 
ADD FOREIGN KEY (best_a_id) 
REFERENCES answer(a_id); 

Просто любопытно, но зачем поддерживать отношения вопрос до ответа в обеих таблицах? Потому что (как указывает ypercube) у вас нет «лучшего ответа», когда вопрос сначала задан, но ваш дизайн требует его. Вероятно, лучше поддерживать эти отношения в таблице ответов, подобно тому, как Оливье рекомендовал.

+0

Wow !!!! Огромное спасибо!!! =] –

+4

И как вы будете вставлять строки? –

+1

@happy pude: Это может работать, только если 'question.best_a_id' установлен как Nullable. –

3

Добавить флаг в таблицу ответов.

create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
    best_answer  numeric(1) default 0 not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

И удалите best_a_id из раздела вопросов.

+0

Это лучший подход, но сложный бит - гарантировать, что только один ANSWER является лучшим для каждого ВОПРОСА. Я знаю, как это сделать с СУБД Oracle, но я не думаю, что MySQL поддерживает функциональные индексы, уникальные или другие. – APC

+2

Неплохо, но я бы предпочел иметь таблицу best_answer. –

+0

Вы также можете использовать триггер AFTER UPDATE, чтобы очистить флаг других ответов с помощью того же question_id. –

5

Рассматривает избавление от question.best_a_id и, вместо этого, добавляя best_answers таблицы:

create table best_answers 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id, q_id) references answer(a_id, q_id) 
); 

Если вы когда-либо иметь более одного лучшего ответа на конкретный вопрос (возможно, галстук), добавить best_a_id столбца к первичному ключу.

+0

Я отредактировал ваш ответ, чтобы правильно отразить ссылки. –

+0

Спасибо, @ypercube –

+0

В MySQL потребуется 'UNIQUE KEY' в таблице' answer' на '(a_id, q_id)'. –