2017-08-26 36 views
-3
DELIMITER $$ 
CREATE TRIGGER `krishna`.`tbl_venue_BEFORE_INSERT1` BEFORE INSERT ON `tbl_venue` FOR EACH ROW 
Begin 
if new.ground_name =.ground_name 
then 
SIGNAL SQLSTATE '45000' 
SET MESSAGE_TEXT = 'Cannot add or update row: only one active row allowed per type'; 
END IF ; 
END $$ 
DELIMITER ; 

我想在同一個表中已經存在的地面名比較new.ground_name ...但我得到了一個語法錯誤:是觸發程序

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'then SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot add or update row: only ' at line 4

+0

Mysql和ms sql server是兩種不同的產品。請僅使用相關的產品標籤。此外,請分享整個錯誤消息,因爲它會告訴我們在哪裏語法錯誤(雖然我有預感) – Shadow

+0

這個問題需要一些嚴重的編輯... –

回答

0

的語法錯誤的結果是代碼中的.ground_name,因爲mysql無法解釋它。

更廣泛的問題是您需要通過select檢查表中是否存在該值。但是,我只是在ground_name字段上使用唯一索引來防止重複值。這比編寫觸發器簡單得多。

+0

請給我查詢使用選擇查詢 – krishna

+0

正如我寫的,那裏這樣做沒有意義。 – Shadow

+0

先生....我不明白你願意說什麼.... – krishna

-1

鑑於

MariaDB [sandbox]> select * from sports; 
+------+------------+ 
| ID | Sport  | 
+------+------------+ 
| 1 | Football | 
| 2 | Basketball | 
| 3 | Volleyball | 
| 4 | Soccer  | 
| 5 | Badminton | 
| 11 | Squash  | 
+------+------------+ 
6 rows in set (0.00 sec) 

這觸發

DELIMITER $$ 
CREATE TRIGGER `sandbox`.`tbl_venue_BEFORE_INSERT1` BEFORE INSERT ON `SPORTS` 
FOR EACH ROW 
Begin 
if exists (select * from sports where sport = new.sport) 
then 
SIGNAL SQLSTATE '45000' 
SET MESSAGE_TEXT = 'Cannot add or update row: only one active row allowed per type'; 
END IF ; 
END $$ 
DELIMITER ; 

將拋出試圖重複插入的錯誤。 正如Shadow所說,這可以通過一個獨特的索引來處理。請注意使用if存在以檢查重複項。 由於錯誤信息沒有什麼意義,因爲觸發器只會觸發插入,所以如果您需要檢查更新,那麼您還需要編寫更新觸發器。您還應該注意,如果批量插入中的任何一個插入都是重複的,那麼批量插入中傳遞的所有值都將被拒絕 - 您可能想要使用錯誤日誌來處理此問題,而不是簡單地拒絕所有進程。