Я пытаюсь сделать связь "один к одному" в 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 в панели. Единственная проблема я сталкиваюсь этим, - то, что будет проблема целостности, когда я попытаюсь вставить в также. Я хотел бы некоторую справку, спасибо.
Истинный однозначный -один связь в реляционной базе данных лучше всего делать, добавляя столбец; Если данные в этих двух таблицах всегда требуются для каждой записи, тогда таблица должна быть определена как foo (fooID, name, barname).
Вы можете отложить проверку ограничений до конца транзакции. Однако я не нашел ничего для MySQL (это не самая продвинутая база данных). Для PostgreSQL (для других синтаксис различается):
ALTER TABLE foo ADD FOREIGN KEY (fooID) REFERENCES bar DEFERRABLE;
Что означает, что ограничение будет проверяться в конце транзакции.
Если вы вынуждены использовать MySQL, воспользуйтесь ответом Криса Шаффера.
Я нашел " хакерское " решение этой проблемы, можно использовать переменную foreign_key_checks .
Если кто-то изменит fooID в foo, чтобы иметь ограничение внешнего ключа в bar, можно затем вставить это как таковое
SET foreign_key_checks = 0;
INSERT...;
INSERT...;
SET foreign_key_checks = 1;
Как я сказал « hacky », и я, вероятно, не стал бы этого делать на производственная система.