Связь "один к одному" в MySQL

Я пытаюсь сделать связь "один к одному" в MySQL DB. Я использую механизм 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`)
)

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

5
задан OMG Ponies 11 March 2010 в 18:17
поделиться

3 ответа

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

4
ответ дан 14 December 2019 в 19:10
поделиться

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

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

Что означает, что ограничение будет проверяться в конце транзакции.

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

1
ответ дан 14 December 2019 в 19:10
поделиться

Я нашел " хакерское " решение этой проблемы, можно использовать переменную foreign_key_checks .

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

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

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

0
ответ дан 14 December 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: