Mysql

通過在同一個表中插入後啟動的行級觸發器在表中插入行

  • January 5, 2015

我必須在 SQL 中設計一個模式和触發系統,以保存單詞及其同義詞

我想到了這個基本模式:

create table words (
   id int primary key auto_increment,
   word varchar(50)
);

create table synonyms(
   w1 int references words(id),
   w2 int references words(id),
   primary key (w1, w2)
);

另一個要求是使同義詞關係對稱(如果 a 是 b 的同義詞,則 b 是 a 的同義詞,表同義詞應相應更新)。

我想過使用如下所示的觸發器:

create trigger MakeSynonymsSymmetric
after insert on synonyms
for each row
insert into synonyms
values (new.w2, new.w1); 

這當然不會起作用,因為觸發器會啟動自身產生無限循環(或者至少這是我的理解)。

試圖插入synonyms給我這個錯誤:

無法更新儲存函式/觸發器中的表“同義詞”,因為它已被呼叫此儲存函式/觸發器的語句使用。

通過以不同方式定義架構但始終使用觸發器來解決此問題的任何方法?

根據此範例執行您正在尋找的內容:

INSERT INTO synonym_bucket VALUES (23,37);

建議 #1

DROP TABLE IF EXISTS synonym_bucket;
CREATE TABLE synonym_bucket LIKE synonyms;
ALTER TABLE synonym_bucket ENGINE=BLACKHOLE;
DELIMITER $$   
CREATE TRIGGER MakeTwoSynonyms
AFTER INSERT ON synonym_bucket 
FOR EACH ROW
BEGIN
   IF new.w1 <> new.w2 THEN
       INSERT IGNORE INTO synonyms VALUES (new.w1, new.w2),(new.w2, new.w1);
   END IF;
END $$
DELIMITER ;

usingsynonym_bucket只佔用 2K(表定義加觸發器)

底線:對於表的前後觸發器,您不能對同一個表執行額外的 DML。但是,您可以從觸發器執行 DML 到另一個表。這就是我製作BLACKHOLE表的原因。它最多需要2K(表定義和触發程式碼)。您使用它來寫入單獨的表。在這種情況下,synonym_bucket是否將雙重 INSERT 插入synonyms.

建議 #2

自己做雙重插入

INSERT IGNORE INTO synonyms VALUES (23,37),(37,23); 

無需觸發器

試一試 !!!

引用自:https://dba.stackexchange.com/questions/87590