Mysql

如果插入的記錄在另一個表中不存在,則觸發刪除該記錄

  • October 30, 2013

我有個問題。我有兩張桌子:

  • zip_code (zip_id, zip_code, state) - 這是一個靜態表,用於儲存我服務的區域
  • tech_zips (tz_id, tech_id, zip) - 這是我儲存特定技術服務的郵政編碼的地方

因此,在我的表單上,我有一個選擇列表,可以選擇技術和文本區域以粘貼到郵政編碼中。這很好用,除了它沒有考慮我是否為郵政編碼提供服務。

與其在 PHP 中想出瘋狂的數組之類的東西 - 我認為觸發器會更容易,除非我對它們一無所知。:(

我將如何編寫執行此操作的觸發器:當將新的郵政編碼插入 tech_zips 時,觸發器會查看 zip_code 表中是否存在該郵政編碼。如果沒有,則將其刪除。

謝謝你的幫助!哦,我有phpmyadmin。

好吧,這是一個瘋狂而新穎的想法,但是您可能會認為這實際上是外鍵約束的用途……如果其中的列具有針對列的外鍵約束,則不能在表“x”中插入行在表“y”中,但您在“x”中插入的值在“y”中不存在…

mysql> create table t1 (
        id int not null auto_increment primary key
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.40 sec)

mysql> create table t2 (
        id int not null auto_increment primary key, 
        t1_id INT NOT NULL, 
        FOREIGN KEY(t1_id) REFERENCES t1(id)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.49 sec)

mysql> insert into t2 (t1_id) VALUES (1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
(`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`t1_id`) REFERENCES `t1` (`id`))

mysql>

你不能讓一個 INSERT 觸發器刪除同一行,只是把它。

作為記錄,可以使用一些特殊程式碼製作觸發器,以在郵政編碼失去的情況下中斷觸發器的進度。但這合理嗎?它會逐行減慢 INSERT 的速度。如果缺少任何郵政編碼,它也會干擾批量插入。

嘗試建構一個 INSERT 來接收來自 SELECT 的結果,該結果為您提供全有或全無:

INSERT INTO tech_zips (tech_id, zip)
SELECT A.NewTechID,B.zip_id FROM
(SELECT 12345 NewTechID,'10013' zip_code) A
INNER JOIN zip_code B ON A.zip_code=B.zip_code;

如果您有一批郵政編碼,請執行以下操作:

INSERT INTO tech_zips (tech_id, zip)
SELECT A.NewTechID,C.zip_id FROM
(SELECT 12345 NewTechID) A,
(
   SELECT '10013' zip_code UNION
   SELECT '10014'          UNION
   SELECT '10015'          UNION
   SELECT '10016'
) B
INNER JOIN zip_code C ON B.zip_code=C.zip_code;

在第一種情況下,如果表中不存在 zip_code ‘10013’,則不zip_code插入任何內容。

在第二種情況下,如果表中不存在 zip_codes ‘10014’ 和 ‘10015’ zip_code,您應該期望 tech_id12345插入 2 行,其中 zip_ids 為 zip_codes ‘10013’ 和 ‘10016’。因此,觸發器中沒有亂七八糟的 DELETE/UNDELETE 程式碼。

試一試 !!!

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