Отношения один к одному в MySQL - PullRequest
5 голосов
/ 11 марта 2010

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

CREATE TABLE `foo` (
  `fooID` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `name` TEXT NOT NULL
)

CREATE TABLE `bar` (
  `barName` VARCHAR(100) NOT NULL,
  `fooID` INT(11) NOT NULL PRIMARY KEY,
  CONSTRAINT `contact` FOREIGN KEY (`fooID`) REFERENCES `foo`(`fooID`)
)

Теперь, когда я настроил их, я изменяю таблицу foo, чтобы fooID также становился внешним ключом для fooID в баре. Единственная проблема, с которой я сталкиваюсь, - это проблема целостности, когда я пытаюсь вставить ее в любую из них. Мне нужна помощь, спасибо.

Ответы [ 3 ]

4 голосов
/ 11 марта 2010

Истинное отношение один к одному в реляционной базе данных лучше всего сделать, добавив столбец; Если данные в этих двух таблицах всегда требуются для каждой записи, тогда таблица должна быть определена как foo (fooID, name, barname).

1 голос
/ 11 марта 2010

Вы можете отложить проверку ограничения до конца транзакции.Однако я не нашел ничего для MySQL (это не самая продвинутая база данных).Для PostgreSQL (для других синтаксис меняется):

ALTER TABLE foo ADD FOREIGN KEY (fooID) REFERENCES bar DEFERRABLE;

Это означает, что ограничение будет проверено в конце транзакции.

Если вам нужно использовать MySQL, используйте ответ Криса Шаффера.1006 *

0 голосов
/ 14 марта 2010

Я нашел решение " hacky ", можно использовать переменную foreign_key_checks .

Если изменить fooID в foo для ограничения внешнего ключа в баре, можно вставить его как таковое

SET foreign_key_checks = 0;
INSERT...;
INSERT...;
SET foreign_key_checks = 1;

Как я сказал " hacky ", и я, вероятно, не хотел бы этого в производственной системе.

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