2016-07-24 72 views
3

我試圖使觸發器在某些條件下觸發條件 在UPDATE之後,在以特定字符串開頭的表(如「 A_「例如。如何使更新後觸發的觸發器僅適用於以「Table_」開頭的表格

CREATE TABLE `Table_TEST` (
    `id` INT(11) NULL DEFAULT NULL, 
    `A` INT(11) NULL DEFAULT NULL, 
    `B` INT(11) NULL DEFAULT NULL, 
    `C` INT(11) NULL DEFAULT NULL 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=InnoDB 
; 

觸發應使SUM(列「A」)減去SUM(列「B」)到已更新,這SUM寫入該行中列「C」的行的索引。

CREATE DEFINER=`root`@`localhost` 
TRIGGER `Table_TEST_before_insert` BEFORE UPDATE ON `Table_TEST` FOR EACH ROW 
BEGIN 
SET new.C = (SUM(new.A)-SUM(new.B)); 
END 

這觸發不工作,使這種故障

UPDATE `Testdb`.`Table_TEST` SET `b`='4' WHERE `id`=1 LIMIT 1; 
/* SQL Fehler (1111): Invalid use of group function */ 

在此之後應根據給定的公式最多,在列「C」 該索引之後來更新所有其他值各自的指數。

現在我寫了一個函數在php中,我追加每個更新後在我的PHP腳本數據庫中。但它其實不是我想要的。

我想這是一個例程/觸發器。

我試過這個樣子的是什麼,但要注意,它不工作

CREATE DEFINER=`root`@`localhost` 
TRIGGER `TABLE_1_before_update` BEFORE UPDATE ON `TABLE_1` FOR EACH ROW 
BEGIN 
SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id; 
END 

我得到的失敗是: SQL Fehler(1064):您有一個錯誤的SQL語法;檢查與你的MySQL服務器版本相對應的手冊,在'WHERE id = NEW.id;'附近使用正確的語法。 END第2行

你能幫我嗎?

回答

1

嗯,我認爲你可以選擇表格,然後你做你的觸發器。

SELECT `TABLE_NAME` 
    FROM information_schema.tables 
WHERE table_schema='<your-database-name>' 
    AND `TABLE_NAME` LIKE 'a%' 

編輯:

沒有測試,但是這也可以工作(如果沒有,只需選擇與之前的查詢表名稱,然後就像我之前說創建的每個觸發器)。

CREATE 
DEFINER=`user`@`localhost` 
TRIGGER `trigger_name` AFTER UPDATE 
ON (
    SELECT `TABLE_NAME` 
     FROM information_schema.tables 
    WHERE table_schema='<your-database-name>' 
     AND `TABLE_NAME` LIKE 'a%' 
) FOR EACH ROW 

BEGIN 
    SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id; 
END 

注:請務必將<your-database-name>爲你的數據庫名。

+0

SQL失敗1362:在觸發器 –

+0

之後不允許更新NEW行,然後我將其更改爲BEFORE UPDATE。:SQL Fehler(1064):您的SQL語法有錯誤;檢查與你的MySQL服務器版本相對應的手冊,在'WHERE id = NEW.id;'附近使用正確的語法。 END'在第2行*/ –

+1

嗯......我不確定AFTER UPDATE(正如我在發佈時所說的那樣),但是BEFORE UPDATE應該可以工作。正如您在錯誤消息中看到的那樣,它是您添加的部件上的語法錯誤。如果您希望我(和其他人)檢查它並提供幫助,請檢查您的語法或發佈您的代碼。 –

0

觸發器屬於特定的表。 你需要手動添加一個觸發器到你想要監視的每個表(在你的情況下,每個表的名字以'A'開頭)。

文檔:CREATE TRIGGER Syntax

你的要求似乎怪我。僅更新名稱與過濾器匹配的表的數據是很常見的。你確定你不能重新組織你的數據庫結構並將所有「A *」表的數據合併到一個表中嗎?

+0

謝謝你的評論。我選擇這個的原因有性能方面的原因。 OKAY我明白了,然後讓我們談談問題的第二部分。 –