2012-09-11 89 views
2

我學習SQL,並有一些表像下面:父母與子女表 - 確保兒童完成

Person (id*, name) 
Customer(id*, is_active, ...) 
Employee(id*, department_id, ...) 

(*表示主鍵,這在客戶和員工的情況下,既一個PK和一個FK回人)

客戶和員工都是人的類型,我想確保當一個記錄被插入人時,記錄也必須插入到任何客戶或員工,但不是兩者。在這個例子中,一個人不能既是員工又是客戶。

我被告知觸發器對強制執行此約束會很有用。有人可以用這個簡單的例子來解釋觸發器的用法嗎?

+0

您不必使用觸發器。你可以做一個插入2行的過程。 –

+0

您正在使用哪些DBMS?甲骨文? PostgreSQL的? –

+0

你確定觸發是你想要的嗎?根據您在此處的設計,觸發器可能沒有所需的所有信息來正確填充要填充的兩個表中的任何一個。您可能想要將應用程序代碼中的插入作爲事務的一部分來處理。 – kolossus

回答

2

根據你的DBMS支持等因素的影響,您可以:通過被實施,以確保正確的行爲的存儲過程

  • 插入。
  • 或者在視圖上使用觸發器(即與特定子類型聯接超類型)以使視圖「可更新」,然後插入到視圖中。
  • 或者通過純聲明的方式確保子類型的排他性和存在性,正如解釋here
  • 或者如here所述,使用不同於「各個表中的所有類」的繼承的實現策略。
1

如果您想確保某人是客戶或員工,則可以在名爲「類型」的人員表中創建一個列,例如,其值可以爲「客戶」和「員工」或「1 「和」2「。 然後按照上面的註釋建議,將相關信息插入到Customer或Employee表中。

+0

好的,我理解這種方法。但是多表方法更靈活嗎? – xingyu