2012-10-26 69 views
0

我在mysql中有兩個表。表A具有主密鑰證書ID和數千證書。 它也有一個關鍵的UserID。表B具有主鍵UserID。 表B具有不在表A中的用戶ID。我的意思是我們有表A中沒有出現在表B中的用戶ID。但是表B中的所有用戶ID都可以在表A中找到。 參照完整性是否可行? 如何在這裏執行參照完整性?引用完整性SQL

+0

在連接上閱讀 –

+0

@ meisam-mulla我瞭解連接。我的老闆希望我實施RI。 – Sithelo

+0

然後使用外鍵。 –

回答

0

這只是表示表A的UserID取決於表B的UserID。但tableB不依賴於tableA。模式看起來像這樣,

CREATE TABLEB 
(
    UserID INT, 
    ......, 
    CONSTRAINT tb_pk PRIMARY KEY (USERID) 
); 

CREATE TABLEA 
(
    CertID INT, 
    UserID INT, 
    ....., 
    CONSTRAINT tb_pk1 PRIMARY KEY (CertID), 
    CONSTRAINT tb_fk FOREIGN KEY (UserID) REFERENCES tableB(UserID) 
); 

您可以在tableB上插入任何記錄。但TableA上,如果你想插入記錄,確保用戶ID的值必須首先存在tableB的的UserID或其他聰明人,你會得到一個錯誤

ERROR 1452 (23000): cannot add or update a child row.... 
+0

我明白你的意思了。但從我對問題的看法來看,我可以執行RI嗎? – Sithelo

0

你不能強制referential integrity這裏,因爲TableA具有UserID列中不存在於TableB的UserID列中的項目,因此即使沒有任何參照完整性約束,您也可以使用join從兩個表中獲取值。

0

在高層次上,MySQL中的引用完整性由您正在使用的存儲引擎進行管理。

早期的存儲引擎根本不支持引用完整性,但像InnoDB這樣的新存儲引擎(我相信新安裝的默認設置)確實支持它。

檢查您的存儲引擎,看它是否支持引用完整性。 InnoDB會是一個好消息。 (一旦/如果)您正在使用支持引用完整性的引擎,則需要定義外鍵約束來定義關係。

有用底漆可以在這裏找到: -

http://blogs.sakienvirotech.com/index.php/random/2011/09/19/mysql-101-referential-integrity

+0

謝謝保羅。我有InnoDB引擎。我只想知道的是:是否有可能在不刪除表B中不匹配的值的情況下對所討論的表執行RI? – Sithelo

+0

不,完整的參照完整性是你沒有孤兒孩子的記錄沒有父母。你有沒有考慮將子記錄存檔? –

0

參照完整性不僅僅意味着一個基本的外鍵等等。它還會問這個問題,如果在表B中刪除或更改了具有某個UserID的行,會發生什麼情況。這是一個業務問題,您可以級聯這些更改。級聯刪除意味着如果您刪除用戶,您想要將該用戶的鏈接刪除到證書,級聯更新意味着更改表B中的用戶ID也會更改表A中的相應值。設置爲NULL意味着如果刪除用戶,您希望保留其鏈接記錄,但將表A中的用戶標識設置爲NULL,並且什麼都不做,意味着您將不允許刪除或更新表B中的行,但表A中有對它的引用。

參照完整性是一個總括術語,並不意味着在任何情況下都是一樣的。它只具有與特定系統或實現相關的完整性。