2016-03-30 104 views
0

我有這樣的代碼在這裏:MySQL的插入後觸發澄清

CREATE TRIGGER testTrigger 
AFTER INSERT ON users 
BEGIN 
    DECLARE @uid VARCHAR(60) 
    SET @uid = (SELECT userid FROM inserted) 
    INSERT INTO user_locations (id,uid,lat,lng) VALUES (0,@uid,5.0,5.0) 
END; 

的想法是儘快插入產生的用戶ID爲其他表一起其他一些數據,因爲它擊中了第一個「用戶」表,但phpMyAdmin的給此錯誤代碼:

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 
BEGIN 
DECLARE @uid VARCHAR(60) 
SET @uid = (SELECT userid FROM inserted) 
at line 3 

有人可以澄清爲什麼這個觸發器是壞的嗎?

+0

您缺少FOR EACH ROW – Mihai

回答

1

我看四個方面的問題:

  • 你必須使用DELIMITER這麼你能夠用分號照常完成的命令。
  • FOR EACH ROW缺失。
  • 使用new.uid訪問最近插入的uid。
  • 我也建議使用過程變量而不是特定於會話的用戶定義@variables,後者是鬆散類型的,並沒有像你所做的那樣聲明。

但是你甚至不需要聲明一個變量。 如果不使用phpMyAdmin

DELIMITER // 
CREATE TRIGGER testTrigger 
AFTER INSERT ON users FOR EACH ROW 
BEGIN 
    INSERT INTO user_locations (id,uid,lat,lng) VALUES (0,new.uid,5.0,5.0); 
END// 
DELIMITER ; 

檢查this answer有關分隔符和the MySQL 5.7 docs on triggersthis answer有關變量。

編輯,我overread你使用phpMyAdmin:

我不使用phpMyAdmin。但你可以(從here偷來)

  • 在phpMyAdmin中,選擇你要使用的數據庫。
  • 轉到頁面頂部的SQL選項卡。
  • 在「運行SQL查詢/查詢數據庫」窗體中,將分隔符更改爲$$。 (位於表單底部的小框中)
  • 將SQL觸發器輸入到表單的主對話框中。正確的語法如下:
CREATE TRIGGER testTrigger 
AFTER INSERT ON users FOR EACH ROW 
BEGIN 
    INSERT INTO user_locations (id,uid,lat,lng) VALUES (0,new.uid,5.0,5.0); 
END;$$ 
  • 命中 「GO」 具有超級權限。