2008-10-07 85 views
3

我主要對pgsql感興趣,但我想知道在任何RDBMS中是否有方法執行插入操作,沒有禁用並重新啓用任何FOREIGN KEY或NOT NULL約束,互相參考。 (你可能會認爲這是莫名其妙地從自己的蛋生雞)Can /你如何在不破壞RI的情況下添加一個引用圈?

對於一個實際的例子,如果你有一個多項選擇題測驗系統,以表「問題」和「答案」,其中的問題.correct_answer引用answer.id,而answer.question引用question.id,是否可以同時添加問題及其答案? (爲了記錄,我知道你可以在事務塊中禁用和重新啓用,另一種解決方案是沒有correct_answer列,而是具有answer.correct作爲布爾值,並有一個檢查約束條件,確保每個問題只有一個正確的答案,但我並不好奇這裏的替代解決方案。)

+0

該問題的標題不合適。儘量使它適合於實際的問題。 – Nick 2008-10-07 17:45:30

+0

感謝您的建議。希望新的標題更有幫助。 – Kev 2008-10-07 17:51:15

回答

4

我認爲你回答了你自己的問題 - 你必須創建一個交易塊。在PostgreSQL這應該工作:

BEGIN; 
    SET CONSTRAINTS ALL DEFERRED; 
INSERT INTO questions (questionid, answerid, question) 
    VALUES (1, 100, 'How long are Abraham Lincoln\'s legs?'); 
INSERT INTO answers (answerid, questionid, answer) 
    VALUES (100, 1, 'Long enough to reach the ground.'); 
COMMIT; 

它是在一個事務塊,因爲如果任INSERT語句失敗,數據庫將處於無效狀態(表約束沒有得到滿足)。

+0

我不知道「設置約束」 - 謝謝! – Kev 2008-10-07 18:27:03

0

我會做下列方式:

  1. 定義Questions.correct_answer作爲 空列。
  2. 將行插入到問題中,並將correct_answer設置爲NULL。
  3. 將行插入Answers,引用問題中的行。
  4. UPDATE Questions SET correct_answer =?
0

在一個問題和一個答案的簡單情況下,建議將所有屬性放在一個表中。

相關問題