如何在MySQL表上添加组合约束?

时间:2019-01-05 12:08:19

标签: mysql

我正在创建一个简单的图书馆管理应用程序,其中已发行的图书数据被捕获在称为“事务”的表中。该表的结构如下所示,如果该书尚未被会员退还,则date_of_return可以为null。书籍返回图书馆后,date_of_return将会设置为某个datetime值,即不为null。

由于一本书只能发行给一个成员,因此我们应该为book_id找到最多一行,其中date_of_return为null。给定具有date_of_return的book_id的两行都不为空。如何将此指定为约束?因为这似乎是唯一约束类型,所以很复杂。

写作是解决此问题的唯一方法吗?

mysql> describe transaction;

+----------------+------------+------+-----+---------+----------------+

| Field          | Type       | Null | Key | Default | Extra          |

+----------------+------------+------+-----+---------+----------------+

| id             | bigint(20) | NO   | PRI | NULL    | auto_increment |

| book_id        | bigint(20) | NO   | MUL | NULL    |                |

| member_id      | bigint(20) | NO   | MUL | NULL    |                |

| date_of_issue  | datetime   | NO   |     | NULL    |                |

| date_of_return | datetime   | YES  |     | NULL    |                |

+----------------+------------+------+-----+---------+----------------+

1 个答案:

答案 0 :(得分:1)

您可以为(book_id,date__of_return)创建不受约束的约束,以便如果尚未归还该书,则没有人可以拥有该书。假设您的表有此记录

book_id  ... . date_of_return
   1               null

那么就不会有其他任何具有相同的book_iddate_of_Return的记录

ALTER TABLE transactions
ADD CONSTRAINT uc_transactions_book UNIQUE (book_id,date_of_return);

并且由于您的date_of_Return是日期时间,因此当同一天多次发行并归还图书时,您不会有任何问题。