触发只允许1辆车

问题描述 投票:0回答:1

我目前正试图制造一个触发器,这将设置一个人只能租一辆车的约束。

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
mysql sql
1个回答
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;

我希望这表明它应该如何工作,即使它没有完全映射到您的数据结构。我再次警告你,这是一个非常糟糕的想法作为触发器。

© www.soinside.com 2019 - 2024. All rights reserved.