我正在创建一个简单的图书馆管理应用程序,其中发行的书籍数据被捕获在一个名为"事务"的表中。此表的结构如下所示,如果成员尚未返回书籍,则date_of_return可以为 null。一旦书籍返回图书馆,date_of_return将被设置为某个日期时间值,即不为空。
由于一本书一次只能发给一个成员,因此对于date_of_return为空的book_id,我们最多应该找到一行。对于具有 date_of_return 的给定book_id,没有两行不为 null。如何将其指定为约束?因为这似乎是复杂类型的唯一约束。
写入触发器是解决此问题的唯一方法吗?
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 | |
+----------------+------------+------+-----+---------+----------------+
您可以为 (book_id, date__of_return) 创建 unqiue 约束,以便在尚未返回书籍时,没有人可以拥有该书籍。 假设您的表有此记录
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
是日期时间,因此当书籍在同一天多次发行和归还时,您不会遇到问题。