简体   繁体   English

SQL触发器:一次将删除的行插入到表中,而无需将每一列都列为INSERT值

[英]SQL TRIGGER: Insert deleted row into a table at once without listing every column as INSERT values

I have a code that already works, but i'm looking for a way to write an sql statement that inserts into a table when a row has been deleted from another table without my having to list out every column as a value under the insert statement. 我有一个已经可以工作的代码,但是我正在寻找一种写一条sql语句的方法,当从另一张表中删除了一行时,该语句可以插入到表中,而不必在插入语句下列出每一列作为值。 For cases where by a table has many columns it would really come in handy. 对于一个表有许多列的情况,它确实派上用场。 Here's my current code, I hope someone could help me modifiy it. 这是我当前的代码,希望有人可以帮助我修改它。

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 ;

I'm hoping for something like this: 我希望这样的事情:

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 ;

If you are inserting all the columns from the original table you could simplify the trigger to: 如果要插入原始表中的所有列,则可以将触发器简化为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM