Mysql

同時創建 MySQL CHILD 和 PARENT 記錄,並使用 MySQL Triggers 設置 CHILD.PARENT_ID

  • February 3, 2022

當展位不存在以及創建新孩子時,我想在父母和孩子之間建立關係。這可以通過觸發器以某種方式完成,但我不知道如何使用 SQL。

經過一番Google搜尋後,我想出了下面的觸發器概念。

  1. 創建孩子
  2. 創建父級
  3. 獲取最後一個父 id
  4. 使用 parent_id更新CURRENT子記錄

有人可以幫助我實現這一目標嗎?

DELIMITER $$
CREATE
   TRIGGER `database_name`.`trigger_name` AFTER INSERT
   ON `database_name`.`child_table`
   FOR EACH ROW BEGIN

   /*Step 1 - Create Parent record.*/
   INSERT INTO  `database_name`.`parent_table`(id) VALUES (``);

   /*Step 2 - Get last inserted ID of just created Parent record 
     and assign to the variable*/
   DECLARE last_id int;

   SELECT LAST_INSERT_ID INTO last_id;
   FROM information_schema.tables
   WHERE table_name = `parent_table`
   AND table_schema = `database_name`;

   /*Step 3 - Update current record child_table.parent_id with last_id variable*/
   UPDATE NEW.parent_id = last_id;
END$$
DELIMITER ;

或類似的東西,但它有錯誤。

DELIMITER $$

DROP TRIGGER IF EXISTS create_new_child; $$

CREATE 
   TRIGGER create_new_child BEFORE INSERT
   ON child
   FOR EACH ROW BEGIN
   DECLARE last_id INT;
       SELECT AUTO_INCREMENT INTO last_id
       FROM information_schema.TABLES
       WHERE TABLE_NAME = parent
       AND TABLE_SCHEMA = DATABASE();
   INSERT INTO parent (title) VALUES (`TEST`);
   SET NEW.parent_id = last_id;
   END$$
DELIMITER ;

‘where 子句’中的未知列’父’

我認為您必須在插入子行之前執行此觸發器,並且您的程式碼中有很多錯誤。

  1. 您必須在腳本的開頭聲明變數。
  2. 你用 SET 給變數賦值
  3. 只有 LAST_INSERT_ID() 函式是必需的,如果你在更新前執行觸發器,你只需要設置 NEW 值,就是這樣。
DELIMITER $$
DROP TRIGGER `database_name `.`trigger_name` $$
CREATE
   TRIGGER `database_name `.`trigger_name` BEFORE INSERT
   ON `database_name `.`child_table`
   FOR EACH ROW BEGIN
   DECLARE last_id int;
   INSERT INTO  `database_name`.`parent_table`(id) VALUES (0);

   SET NEW.parent_id = LAST_INSERT_ID();
END $$
DELIMITER;

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