MySQL UNIQUE约束多列条件

时间:2012-10-25 17:55:08

标签: mysql sql indexing unique-constraint unique-index

好吧,我有一个包含4列(idevent_idgroup_idisbn)的表格,其中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和答案中的结构不这样做

2 个答案:

答案 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_idEvent表和isbn到(Book?),如果您有一个表isbn是主键或唯一键):

event_id | isbn
   1        123 
   1       1234