2010-03-11 73 views
5

我試圖在MySQL數據庫中建立一對一的關係。我使用InnoDB引擎和基礎表看起來像這樣:MySQL中的一對一關係

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。 我面臨的唯一問題是,當我嘗試插入任何一個時,會出現一個完整性問題。 我想要一些幫助,謝謝。

回答

4

關係數據庫中的真正的一對一關係最好通過添加一列來完成;如果每個記錄總是需要這兩個表中的數據,那麼該表應該定義爲foo(fooID,name,barname)。

+0

@ chris-shaffer不幸的是它必須是兩個單獨的表格。會不會有某種交易方式? 謝謝 – Botto 2010-03-11 23:23:18

+0

@Botto:正如我寫在另一個答案 - 在其他數據庫中可以推遲約束。然而'輕'MySQL在文檔中沒有提及它。 – 2010-03-12 00:13:36

+1

如果它必須是兩個表,請選擇哪個表代表實際實體,然後編寫代碼以處理其他表中的記錄不存在的情況。我認爲這是你能夠做到的最好的。 – 2010-03-12 01:07:51

1

您可以將約束檢查交易結束。但是我沒有找到任何MySQL(它不是最高級的數據庫)。對於PostgreSQL(對於其他語法變化):

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

這意味着約束將在事務結束時被檢查。

如果您必須使用MySQL,請使用Chris Shaffer的答案。

0

我發現了一個「哈克」解決了這個,可變FOREIGN_KEY_CHECKS都可以使用。

如果一個改變foo中有在酒吧外鍵約束的fooID,一個可以然後插入這樣

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

正如我所說的「哈克」我可能不會來此上一個生產系統。