2012-04-27 53 views
3

我有兩個表,一個'主'和一個'孩子'表。 每個表都有一個名爲'ProductNo'的字段,它被定義爲PRIMARY KEY和UNIQUE。 是否可以將表'child'中的字段'ProductNo'和表'master'中的相同字段一起定義爲PRIMARY + UNIQUE?2表上的主鍵

master: 
ID | ProductNo 

child: 
ID | MasterID (FK on master.ID) | ProductNo 

Relation >> 1 (master) : n (child) 


example data: 
master: 
1 | 1234 
2 | 4567 

child: 
100 | 1 | 3333 
101 | 1 | 4444 
102 | 2 | 5555 
103 | 1 | 1234 <----- NOT ALLOWED! PRODUCT NO ALREADY EXISTING IN TABLE `MASTER` 
104 | 2 | 1234 <----- NOT ALLOWED! PRODUCT NO ALREADY EXISTING IN TABLE `MASTER` 

需要它來檢查插入/更新表「孩子」如果「ProductNo」表「大師」已存在。

我該如何定義它? 或者我需要爲此創建一個觸發器?

TIA馬特

+3

你的意思是由小學+獨特???主鍵默認是唯一的。兩者之間的區別僅在於主鍵不接受空值 – 2012-04-27 09:35:59

+0

您的意思是,「child」表中的某行不能與「master」中的某一行具有相同的「ProductNo」,無論其他ID是否匹配?一些示例數據和預期結果(更新允許或拒絕)將會有所幫助。 – onedaywhen 2012-04-27 09:44:24

+0

它不允許在已經在表master中的'child'中產生ProductNo。 – frgtv10 2012-04-27 09:47:26

回答

4

不,不存在表格中的複合PKs。

只是爲了保證數據的一致性,如果Ids是相同的,則應該將孩子的FK添加到主人。

解決您的問題,像這樣的檢查觸發:

if exists (select 1 from master where prodcutId=new_productId) 

將是一個不錯的主意

編輯:

其實最好的辦法是有一個名爲只有一個表產品具有ID和與自身關係的masterID字段。你今天的方式林相當肯定,你有很多重複的數據,你堅持2層的層次結構。

+0

我更新了主線程中的示例數據。認爲這仍然是最好的方式。對? – frgtv10 2012-04-27 09:51:08

+0

是的,但看看我的編輯 – Diego 2012-04-27 09:55:39

+0

使用觸發器的作品完美。我不能使用1個表,因爲'master'有更多的字段,那麼表'child' – frgtv10 2012-04-27 10:00:40

2

(原來的答覆),您可以從主申報的外鍵的孩子,即使外國關鍵點,孩子的主鍵。這將是一對一或零關係,並不罕見。如果在未插入master的情況下沒有匹配的行,那麼行中不能存在行,但在沒有匹配的子行的情況下,行中可以存在行。因此,您的插頁需要在訂單主人和子訂單中進行。但是,在你的情況下,你所指的列看起來應該不是表的主鍵,而是你有一個單獨的主鍵/外鍵,並且所涉及的列在這兩個表中必須是唯一的,現在已經清楚您已將一些示例數據編輯到您的問題中。在這種情況下,如果ProductNo已經存在,最好在兩個表上使用觸發器來檢查另一個表中是否存在,並防止插入/更新。

+0

我得到了1:n的關係。這意味着我不能在'ProductNo'上使用fk。 – frgtv10 2012-04-27 09:44:39

+0

如果產品號碼是唯一的,你怎麼樣? – 2012-04-27 09:47:21

+0

看我的例子數據即時主線程 – frgtv10 2012-04-27 09:50:45

0

您可以在子表中添加一個名爲ProductNo的列,並向父表添加一個外鍵引用。

1

就像@DavidM說的那樣,它可以完成,但似乎你有一些建模問題。首先,如果你有一個自然的主鍵ProductNo,你爲什麼要定義代理ID?您可能考慮的另一件事是將這兩個表合併爲一個表(對於大多數1對1情況可能有意義)。

+0

這可能是真的,是的。但「master」表大約有40個字段,在「child」表中我只有5個字段。這就是爲什麼我們使用2個表格。 – frgtv10 2012-04-27 10:05:53

+0

@ frgtv10,建模選擇對解決方案非常具體,當然你有你的理由;我的觀點只是考慮這種選擇所帶來的好處和折衷:如果將1對1建模爲單個表格,那麼您提出的這個問題就不是問題。 – 2012-04-27 10:11:10

1

你確定你需要兩張表嗎? 只保留一個,有productID加parentID。 然後,productID可以是主鍵和自動增量,而具有非空(如鍵入同一個表)的parentID的所有內容都將是子項目。