2016-07-13 22 views
0

我正在使用Oracle Database 12c企業版。如何確保在SQL的另一個表中沒有設置外鍵?

我有三個表:

table producer (
    pid int primary key, 
    name varchar2(50) 
); 

table movie (
    mid int primary key, 
    pid varchar2(50), 
    name varchar2(50) 
); 

table moviecoproducers (
    mid int, 
    pid int 
); 

在電影表中的PID,例如在moviecoproducers表的PID和中期是通過適當的外鍵引用。另外,moviecoproducers表中的mid和pid值的組合是唯一的。

我現在必須確保沒有生產者在電影表中被引用爲(主要)生產者,並且在同一部電影的moviecoproducer中間表中作爲共同生產者。我創建了一個觸發器來做到這一點,但現在我問自己,如果我要重新設計我的表結構,是否會有更簡單的解決方案(例如檢查約束)。

我是否只需要觸發器是因爲設計不好,因爲我不知道如何以不同的/更好的方式做到這一點。

+2

將** moviecoproducers **重命名爲** movieproducer **並添加'status'(主或不是)字段。現在你可以把所有制作者放到那裏,並從** movie **中刪除'pid'。現在,您可以控制所有內容而無需觸發器 –

+0

Touché。你是絕對正確的。有時很難看到樹木的木材。 :-) 發表您的評論爲答案... – Lonkey

+0

PM PM說。但是,您仍然需要SOMETHING來確保不超過一個生產者被顯示爲任何給定中期的「主要」。建議PM建議這不是自動的。 – mathguy

回答

1

創建一個典型的3臺多到許多結構。

table producer (
    pid int primary key, 
    name varchar2(50) 
); 

table movie (
    mid int primary key, 
    name varchar2(50) 
); 

table movieproducer (
    mid int, 
    pid int, 
    status varchar2(10) 
) 

status將舉辦 「主要」 或 「」 的價值觀。

現在,您可以使用表約束和無觸發器來管理您的限制。

還有一個額外的好處是:如果在將來的某個時候想要引入諸如「初級聯合制作人」之類的東西,則不需要更改模式。

此設計未完全標準化:缺少狀態表。看看你是否有興趣添加它。

0

好了不知道什麼VARCHAR PID代表..所以咱們稍微減少混亂的表結構開始......

table producer (producer_id int primary key, 
       producer_name varchar2(50)) 

table movie (movie_id int primary key, 
       movie_data varchar2(50) 
       movie_name varchar2(50)) 

table movieproducers (movie_id int*# 
         producer_type int* 
         producer_id int#) 

在這裏,我們有MovieProducers內2個共享密鑰(或唯一索引)。首先是movie_id和producer_type,其中1是主要製片人,而任何其他大於1的數字將是聯合制片人防止重複製片人類型 - 以及movie_id和producer_id,這將消除製片人針對特定電影出現多次)

我相信會解決你有問題,而不是需要一個觸發

+0

哦,這很棒,PM 77-1將我的答案重新格式化了一些 - 刪除了雙重唯一索引,這實際上是控制約束的唯一索引 - 並將其稱爲自己的索引,然後將其接受並向上投票。那太蹩腳了。我會直接在PM 77-1上發表評論,但還不能這樣做。此外,沒有PM 77-1,你沒有在你的解決方案中實施任何約束,因爲你的movieproducer表沒有任何鍵,沒有它們,你就沒有約束 – DeJoker

相關問題