mysql - взаимозависимые внешние ключи - PullRequest
7 голосов
/ 24 января 2012

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

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

Вторая таблица называется «Ответ», она содержит информацию об ответах на вопросы, а также должна содержать поле 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),
);

Как мне решить эту проблему?Спасибо

Ответы [ 3 ]

5 голосов
/ 24 января 2012

Подумайте об избавлении от 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 столбец к первичному ключу также.

5 голосов
/ 24 января 2012

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

И SQL для добавления внешнего ключа будет выглядеть так:

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

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

3 голосов
/ 24 января 2012

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

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 из таблицы вопросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...