我正在创建一个简单的图书馆管理应用程序,其中已发行的图书数据被捕获在称为“事务”的表中。该表的结构如下所示,如果该书尚未被会员退还,则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 | |
+----------------+------------+------+-----+---------+----------------+
答案 0 :(得分:1)
您可以为(book_id,date__of_return)创建不受约束的约束,以便如果尚未归还该书,则没有人可以拥有该书。假设您的表有此记录
book_id ... . date_of_return
1 null
那么就不会有其他任何具有相同的book_id
和date_of_Return
的记录
ALTER TABLE transactions
ADD CONSTRAINT uc_transactions_book UNIQUE (book_id,date_of_return);
并且由于您的date_of_Return
是日期时间,因此当同一天多次发行并归还图书时,您不会有任何问题。