2017-04-25 74 views
1

如何正確記錄我當前的AFTER UPDATE觸發器的Student表記錄?

-- Create the SysLog table 
 

 
DROP TABLE IF EXISTS SysLog ; 
 

 
CREATE TABLE IF NOT EXISTS SysLog (
 
    ID INT NOT NULL AUTO_INCREMENT, 
 
    TableName VARCHAR(255) NOT NULL COMMENT 'The table that is being logged', 
 
    Message VARCHAR(255) NOT NULL COMMENT 'The logging message', 
 
    Created DATETIME NOT NULL DEFAULT NOW(), 
 
    PRIMARY KEY (ID) 
 
    ) 
 
ENGINE = InnoDB 
 
COMMENT 'The system log table' ; 
 
CREATE UNIQUE INDEX SysLog_UNIQUE ON SysLog (ID ASC) ; 
 

 

 
-- Create an after update trigger that creates a record in a new table named SysLog 
 
-- whenever a record in the -- student table is changed. 
 
USE College ; 
 

 
DROP TRIGGER IF EXISTS Student_After_Update; 
 

 
DELIMITER $$ 
 

 

 
     CREATE TRIGGER Student_After_Update 
 
     AFTER UPDATE ON Student 
 
     FOR EACH ROW 
 

 
     BEGIN 
 
     
 
\t \t INSERT INTO SysLog(TableName, Message, Created) 
 
      VALUES (Student, \t CONCAT('', "Updated ID=" StudentID), NOW()); 
 
      INSERT INTO SysLog(TableName, Message, Created) 
 
      VALUES (Student, \t CONCAT('', "Updated ID=" StudentID), NOW()); 
 
      INSERT INTO SysLog(TableName, Message, Created) 
 
      VALUES (Student, \t CONCAT('', "Updated ID=" StudentID), NOW()); 
 
     END $$ 
 

 
DELIMITER ; 
 

 
UPDATE Student 
 
SET Scholarship=7000 
 
WHERE ID= 2; 
 

 
UPDATE Student 
 
SET Scholarship=9000 
 
WHERE ID= 5; 
 

 
UPDATE Student 
 
SET Scholarship=10000 
 
WHERE ID= 7; 
 

 
SELECT * FROM SysLog 
 
ORDER BY ID DESC;

大家好,

我創造,創建一個名爲系統日誌新表中的記錄,只要在學生表中的記錄產生了變化的AFTER UPDATE工作,但問題我我該如何正確使用CONCAT語句來正確輸出「UpdatedID = X」的消息,其中X是每個記錄中正在更新的StudentID?這是我迄今爲止的代碼。

回答

0

好像在CONCAT表達式中缺少一個逗號。零長度字符串的目的不明確。這樣做是有效的,但它有點好奇,因爲似乎沒有任何理由。

此外,要引用由UPDATE語句匹配的列的值,請使用NEW.OLD.來限定列名稱。

字符串文字可以用單引號引起來。 (MySQL確實接受以字符串爲單位的雙引號,作爲SQL標準的一個偏差(擴展名),其他數據庫保留雙引號標識符,我的建議是總是使用單引號圍繞字符串文字。)

而且它不是都清楚爲什麼觸發器需要將三行插入Syslog表中。

INSERT INTO SysLog (TableName, Message, Created) 
    VALUES ('Student', CONCAT('Updated ID=' , NEW.StudentID), NOW()); 
     ^ ^  ^  ^^ ^^^^ 
+0

spencer7593-你是什麼意思,你不明白爲什麼觸發器會插入三行?我還會如何記錄三個不同學生的記錄已更新? – User445555

+0

@ spencer7593-我現在看到爲什麼你不明白,因爲觸發器爲一個學生的記錄更新創建三個不同的行。我該如何解決? – User445555

+0

@ spencer7593 - 你說得對,如果我只在我的觸發器中插入一條INSERT語句,它將只產生三條由UPDATE語句更新的記錄。謝謝 – User445555

相關問題