触发只允许一辆车

时间:2019-03-13 18:49:08

标签: mysql sql

我目前正在尝试创建一个触发器,该触发器将设置一个限制,即一个人只能租一辆车。

DELIMITER //
CREATE TRIGGER Carperperson
BEFORE INSERT ON bookings
FOR EACH ROW 
BEGIN
IF NEW.vehicle_id = ?THEN
SIGNAL SQLSTATE '45000' set message_text='You can only book one car per single customer a day!';


DELIMITER;

到目前为止,这就是我的去处,老实说,我对如何构造它有点困惑。

表格:

Bookings, Customers, Vehicles, 
Chauffeurs, Vehicle_Collections, 
Payments, Mechanics, Invoice

1 个答案:

答案 0 :(得分:0)

就像一般建议一样,这似乎应该是业务层的一部分(例如:插入新保留的过程的一部分),而不是触发器。这是因为触发器可能会对性能产生很大的影响,并且该过程将需要查找自定义错误消息,并将这些错误消息显示给最终用户。

根据逻辑,汽车租赁可以是几天的时间,因此您基本上有两种情况,即客户已经有一个要在开始插入租赁之前不退还的租赁,或者正在计划开始计划在归还之前插入新的租金。可能与上述情况发生冲突的一个允许情况是,用户在同一天将车停在一个位置,然后又在另一位置取车,因此我们必须考虑到这一点。

在不知道您的表结构的情况下,很难给出确切的T-SQL代码来处理这些结构。为了说明的目的,我假设您有一个包含UserID,CarID,pickupdate和dropoffdate的表,并且所有这四个值都插入了新行。

DELIMITER //
CREATE TRIGGER Carperperson
BEFORE INSERT ON bookings
FOR EACH ROW 
BEGIN
IF NEW.User_ID = bookings.User_ID
    and ((new.Pickupdate >= bookings.pickupdate and new.Pickupdate < bookings.dropoffdate)
        or (new.dropoffdate > bookings.pickupdate and new.dropoffdate < bookings.dropoffdate))
THEN
SIGNAL SQLSTATE '45000' set message_text='You can only book one car per single customer a day!';


DELIMITER;

我希望它能显示一般的工作原理,即使它没有完全映射到您的数据结构也是如此。我再次警告您,这是一个非常糟糕的主意。