2016-12-29 229 views
0

我有預訂表觸發來避免衝突

id  room  date_IN   date_OUT 
1  101  29-12-2016  1-1-2017 
2  102  29-12-2016  2-1-2017 
3  101  1-1-2017  4-1-2017 

我怎樣才能使觸發避免,如果我修改(ID = 1)2017年3月1日

+0

爲什麼會是這樣重複? – shmosel

+0

你會怎麼做會造成重複? – GurV

+0

我的意思是衝突 – ubuntu

回答

1

你有date_OUT衝突日期創建2個觸發器BEFORE UPDATEBEFORE INSERT。然後檢查要插入或更新的新日期是否在另一個條目的date_IN和date_OUT之間。

一個例子是

CREATE TABLE booking (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    room INT, 
    date_IN date, 
    date_OUT date 
); 

DELIMITER $$ 
CREATE TRIGGER `booking_duplicate_insert` BEFORE INSERT ON `booking` 
FOR EACH ROW 
BEGIN 
IF EXISTS (SELECT date_IN, date_OUT FROM booking WHERE date_IN <= NEW.date_IN AND date_OUT > NEW.date_OUT) THEN 
SIGNAL SQLSTATE '45000' 
SET MESSAGE_TEXT = 'An error occurred'; 
END IF; 
END $$ 
DELIMITER ; 

DELIMITER $$ 
CREATE TRIGGER `booking_duplicate_update` BEFORE UPDATE ON `booking` 
FOR EACH ROW 
BEGIN 
IF EXISTS (SELECT date_IN, date_OUT FROM booking WHERE date_IN <= NEW.date_IN AND date_OUT > NEW.date_OUT) THEN 
SIGNAL SQLSTATE '45000' 
SET MESSAGE_TEXT = 'An error occurred'; 
END IF; 
END $$ 
DELIMITER ; 

insert into booking (room, date_IN, date_OUT) VALUES (101, '2016-12-29', '2017-01-01'); 
insert into booking (room, date_IN, date_OUT) VALUES (101, '2017-01-01', '2017-01-04'); 

// Should fail to insert 
insert into booking (room, date_IN, date_OUT) VALUES (101, '2017-01-02', '2017-01-02');