好吧,我有一个包含4列(id
,event_id
,group_id
,isbn
)的表格,其中id为PK,event_id
和{ {1}}是FK,我的问题是:
我需要isbn编号对于每个group_id
都是唯一的,让我举几个应该可行的行的例子和一些不应该的行:
event_id
id | event_id | group_id | isbn
(1,1,1,123) ok
(2,1,2,123) ok
(3,1,4,123) ok
(4,1,7,1234) ok
(5,2,8,123) NOT OK, the 'isbn' must be unique for event_id('123' was already used in the first row with event_id = 1)
每个group_id
只出现一次,但如果我对3列做出独特的约束,我将能够重复isbn只是在追逐event_id
,而我不希望这样,一旦在event_id
中使用isbn
它不能出现在另一个event_id
中,event_id
(假设为'1')可以重复相同的event_id
每个ibsn
group_id
我知道我有几次重复这个问题,但这是一个棘手的问题,我希望降低得到错误答案的机会
EDIT1:关于@Andomar回答,isbn必须通过基数(1,n)1-isbn - >与group_id相关联。 n-group_id和答案中的结构不这样做
答案 0 :(得分:2)
保持(event_id, isbn)
组合的唯一性:
create unique index UX_YourTable_EventIsbn on YourTable(event_id, isbn)
根据评论,如果您希望每个isbn只有一个事件,则可以重新设计表关系。创建一个名为isbn
的表,其中包含主键isbn
和名为event_id
的字段。这样,ISBN可以有零个或一个与之关联的事件。
isbn isbn primary key, event_id
other_table id, event_id, group_id
查询将查找isbn
表中事件的isbns。
答案 1 :(得分:2)
您所描述的是event_id
取决于isbn
。您需要通过将表分成两个来规范化表:
<强>(更正):强>
删除将isbn
保留在此处 - 并在下面的第二个表格中添加FOREIGN KEY (event_id, isbn)
约束:
id | event_id | group_id | isbn
1 1 1 123
2 1 2 123
3 1 4 123
4 1 7 1234
5 2 8 123 --- not allowed by the FK constraint
创建一个新表,其中isbn
为主键,UNIQUE (event_id, isbn)
键(以及两个外键:event_id
到Event
表和isbn
到(Book
?),如果您有一个表isbn
是主键或唯一键):
event_id | isbn
1 123
1 1234