我是一个初学者,正在使用mysql workbench 8. 0,看起来我不能让这个工作。有三张table。
这些是我的table:
1.图书(id=pk)
| id|标题|作者|
| - -----|- -----|- -----|
| 1|我的第一本书|萨拉|
| 2|我的第二本书|马曼|
| 3|我的第三本书|巴巴|
2.用户(id=pk)
| id|全名|最后登录|
| - -----|- -----|- -----|
| 1|阿拉|1973-07-03|
| 2|巴迪|1972-07-03|
| 3|萨利|2015-10-18 2015-10-18 2015-10-18|
3. checkouts(id=pk,user_id=fk,book_id=fk)
| id|用户id|图书ID|结帐日期|返回日期|
| - -----|- -----|- -----|- -----|- -----|
| 1| 1| 1| 2000年10月18日|2017-10-18 2017-10-18|
| 2| 1|我的天啊|2015-11-18 2015-11-18 2015-11-18|空|
| 3| 2| 3| 2015-10-28 2015-10-28| 2025-10-18 2025-10-18 2025-10-18|
| 4| 3|我的天啊|2016-10-18|它应该给予我一个错误|
- user_id=fk是
users
表的子表。 - book_id=fk是
books
表的子表。
我的解决方案是:当book_id
列有重复项时,return_date
列不能有重复项。
所以当插入第4行时,它不应该让我;因为user(3)不能 checkout 没有return_date的东西。
我尝试了对这两个列(book_id
,return_date
)的唯一索引,这样我就可以有唯一的组合,但由于MySQL允许NULL
值重复,我没有得到任何地方。
我也不知道php和python。
你的帮助对我意义重大
对不起我的英语
2条答案
按热度按时间f0brbegy1#
你可以用触发器来阻止
对于最终添加DELIMITER所需的触发器,取决于gui和方法
在批量插入中,将出现1个错误,阻止插入该会话中的所有行
| id|用户id|图书ID|结帐日期|返回日期|
| - -----|- -----|- -----|- -----|- -----|
| 1| 1| 1| 2000年10月18日|2017-10-18 2017-10-18|
| 2| 1| 2| 2015-11-18 2015-11-18 2015-11-18|联系我们|
| 3| 2| 3| 2015-10-28 2015-10-28| 2025-10-18 2025-10-18 2025-10-18|
fiddle
iszxjhcz2#
您可以创建一个存储过程来为您执行 checkout 逻辑。它锁定表,以便检查书是否已被检出以及随后的插入将被视为“临界区”,一次只允许运行该过程的单个调用。除非检出率非常高,否则这不会对性能产生不利影响,并确保两个人不能检出同一本书。
创建存储过程后,您可以执行以下操作: