2017-04-21 8 views
0

作成したテーブルは次のとおりです。新しいテーブルに古いデータを挿入するためのトリガーを作成します。

USE my_guitar_shop; 

DROP TABLE IF EXISTS Products_Audit; 

CREATE TABLE Products_Audit ( 
audit_id INT PRIMARY KEY, 
category_id INT REFERENCES categories(category_id), 
product_code VARCHAR (10) NOT NULL UNIQUE , 
product_name VARCHAR (255) NOT NULL, 
list_price INT NOT NULL, 
discount_percent INT NOT NULL DEFAULT 0.00 , 
date_updated DATETIME NULL); 

products_after_updateという名前のトリガーを作成します。このトリガーは、行が更新された後、製品に関する古いデータをProducts_Auditテーブルに挿入する必要があります。次に、このトリガーを適切なUPDATEステートメントでテストします。

作成したトリガーはここにありますが、データはProducts_Auditテーブルに表示されず、すべてのnullが表示されています。 INSERTと

USE my_guitar_shop; 

DROP TRIGGER IF EXISTS products_after_update; 

DELIMITER $$ 

CREATE TRIGGER products_after_update 
BEFORE UPDATE ON products 
FOR EACH ROW 
BEGIN 
    INSERT INTO products_audit (audit_id, product_id, category_id, product_code, 
    product_name, list_price, discount_percent, date_updated) 

    SELECT audit_id, products.product_id, products.category_id, products.product_code, 
    products.product_name,products.list_price, products.discount_percent, date_updated 

    FROM products JOIN products_audit 
    ON products_audit.audit_id = (SELECT audit_id FROM inserted); 
END $$ 

DELIMITER ; 

EDIT

USE my_guitar_shop; 

    DROP TRIGGER IF EXISTS products_after_update; 

    DELIMITER $$ 

    CREATE TRIGGER products_after_update 
BEFORE UPDATE ON products 
FOR EACH ROW 
    BEGIN 

    INSERT INTO products_audit (audit_id, product_id, category_id,product_code, 
    product_name, list_price, discount_percent, date_updated) 

    VALUES (OLD.audit_id, OLD.product_id, OLD.category_id, OLD.product_code, 
    OLD.product_name, OLD.list_price, OLD.discount_percent, OLD.date_updated) 

    DELIMITER ; 

答えて

0

INTOあなたは、インサートを過度に複雑されています。 triggers上のMySQLのドキュメントが言うように:UPDATEトリガで

を、あなたはそれが更新される前にOLD.col_nameは、行の列 を参照するために使用することができますし、NEW.col_nameは、行の列 を参照しますそれが更新された後。

したがって、挿入にOLD.column_name形式を使用してください。また、私は自動インクリメントにaudit_idフィールドを設定しますと、インサートの外にそれを残す:

INSERT INTO products_audit (product_id, category_id, product_code, 
product_name, list_price, discount_percent, date_updated) 
VALUES (OLD.product_id, OLD.category_id, OLD.product_code, 
OLD.product_name, OLD.list_price, OLD.discount_percent, OLD.date_updated) 
+0

私は製品FROM products_audit文のON products_auditのJOINのために同じことをしますか?私があなたのインサートを追加したとき、私はこのエラーを取得します。トリガーを作成するproducts_after_update各行ごとに製品を更新する前にproducts_audit(audit_id、product_id、category_id、product_code、product_name、list_price、discount_percent、date_updated)VALUES(OLD.audit_id、OLD.product_id、 OLD.category_id、OLD.product_code、OLD.product_name、OLD.list_price、OLD.discount_percent、OLD.date_updated)商品​​からJOIN products_audit – Harvey

+0

あなたはその点を理解できませんでした。選択部分はまったく必要ありません! – Shadow

+0

SELECT部分​​を削除しましたが、最後にVALUESの括弧に構文エラーがあることを示しています。 – Harvey

関連する問題