SQL TRIGGER: вставлять удаленную строку в таблицу сразу, не перечисляя каждый столбец как значения INSERT - PullRequest
1 голос
/ 15 апреля 2019

У меня есть код, который уже работает, но я ищу способ написать SQL-оператор, который вставляется в таблицу, когда строка была удалена из другой таблицы, без необходимости перечислять каждый столбец как значение в оператор вставки. Для случаев, когда у таблицы много столбцов, это действительно пригодится. Вот мой текущий код, я надеюсь, что кто-то может помочь мне изменить его.

CREATE TABLE `history_tblvendorpayment` LIKE `tblvendorpayment`;

ALTER TABLE `history_tblvendorpayment`
MODIFY COLUMN `id` INT UNSIGNED NOT NULL;

ALTER TABLE `history_tblvendorpayment` DROP PRIMARY KEY;

ALTER TABLE `history_tblvendorpayment`
ADD COLUMN `history_id` INT UNSIGNED NOT NULL;

ALTER TABLE `history_tblvendorpayment`
ADD CONSTRAINT PRIMARY KEY (`history_id`);

ALTER TABLE `history_tblvendorpayment`
MODIFY `history_id` INT UNSIGNED NOT NULL AUTO_INCREMENT;

DELIMITER $$

DROP TRIGGER `delete_tblvendorpayment`$$

CREATE TRIGGER `delete_tblvendorpayment` BEFORE DELETE on `tblvendorpayment`
FOR EACH ROW
BEGIN
    INSERT INTO history_tblvendorpayment (id, created_by,
    vendor_id, amount_payable,
    amount_payed, description,
    depositor_name, gl_code_credit,
    gl_code_debit, txn_date,
    pay_date, ref_id,
    bank, currency,
    date, md_approval,
    status, sage_status,
    memo_id)  
    VALUES (
        OLD.id, OLD.created_by,
        OLD.vendor_id, OLD.amount_payable,
        OLD.amount_payed, OLD.description,
        OLD.depositor_name, OLD.gl_code_credit,
        OLD.gl_code_debit, OLD.txn_date,
        OLD.pay_date, OLD.ref_id,
        OLD.bank, OLD.currency,
        OLD.date, OLD.md_approval,
        OLD.status, OLD.sage_status,
        OLD.memo_id
    );END$$

DELIMITER ;

Я надеюсь на что-то вроде этого:

DELIMITER $$

DROP TRIGGER `delete_tblvendorpayment`$$

CREATE TRIGGER `delete_tblvendorpayment` BEFORE DELETE on `tblvendorpayment`
FOR EACH ROW
BEGIN
    INSERT INTO history_tblvendorpayment 
    SELECT * FROM OLD;
    END$$

DELIMITER ;

1 Ответ

2 голосов
/ 15 апреля 2019

Если вы вставляете все столбцы из исходной таблицы, вы можете упростить триггер до:

CREATE TRIGGER `delete_tblvendorpayment` BEFORE DELETE on `tblvendorpayment`
FOR EACH ROW
BEGIN
    INSERT INTO history_tblvendorpayment
    SELECT *
    FROM tblvendorpayment
    WHERE id = OLD.id;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...