2012-04-27 22 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的所有内容都将是子项目。