Mysql
如果插入的記錄在另一個表中不存在,則觸發刪除該記錄
我有個問題。我有兩張桌子:
- 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 程式碼。試一試 !!!