2017-11-06 7 views
0

MySQLサーバのバージョンに対応するマニュアルを確認します...MySQLのトリガー:#1064 - SQL構文にエラーがあります。これはデ構文である私は、MySQL 5.1.73 にトリガを作成する問題を抱えている

DELIMITER $$ 
CREATE TRIGGER `discount2` 
BEFORE 
INSERT ON `order_item` 
FOR EACH ROW 
DECLARE alumno INT; 
DECLARE profesor INT; 
DECLARE dto decimal(10,2); 
SET @alumno := (SELECT user_id from `order` where `order`.id = NEW.order_id) 
SET @profesor := (SELECT id_profesor from user where user.id = @alumno) 
SET @dto := (SELECT descuento from descuentos 
join user on descuentos.id_profesor = user.id 
join producto on producto.familia=descuentos.familia 
where producto.id = NEW.product_id and user.id = @profesor) 

SET.NEW.descuento = SELECT CAST((((@dto)*(NEW.pvp))/100) AS DECIMAL(10,2)) 
$$ 
DELIMITER ; 

しかし、いくつかのエラーがある

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE alumno INT; 
DECLARE profesor INT; 
DECLARE dto decimal(10,2); 
SET @alu' at line 5 

誰かが私を助けることができますか? おかげU

+0

エラー作成または実行上のエラー、エラーコードとメッセージは何ですか?すべてのステートメントは終了する必要があります。あなたは最初の宣言の前に始まり、最後の$$の前に終わりが必要です。 –

+0

実際には、私が答えとして追加した非常に多くのエラーがあります。 –

+0

私はエラーを追加しました! – acordero

答えて

0

(注)このsyntaxsしかし

drop trigger if exists discount2; 

DELIMITER $$ 
CREATE TRIGGER `discount2` 
BEFORE 
INSERT ON `order_stage` 
FOR EACH ROW 
begin 
DECLARE alumno INT; 
DECLARE profesor INT; 
DECLARE dto decimal(10,2); 
SET alumno = (SELECT user_id from `order` where `order`.id = NEW.order_id); 
SET profesor = (SELECT id_profesor from user where user.id = alumno); 
SET dto = (SELECT descuento from descuentos 
join user on descuentos.id_profesor = user.id 
join producto on producto.familia=descuentos.familia 
where producto.id = NEW.product_id and user.id = profesor); 

SET NEW.descuento = (SELECT CAST((((dto)*(NEW.pvp))/100) AS DECIMAL(10,2))); 
end $$ 
DELIMITER ; 
+0

ありがとうございました!すばらしいです!あなたの解決策は正しいです! – acordero

1

の仕事は "MySQLではBEFORE INSERTトリガーを作成するための構文はないことがあります。

CREATE TRIGGER trigger_name 
BEFORE INSERT 
    ON table_name FOR EACH ROW 

BEGIN 

    -- variable declarations 

    -- trigger code 

END; 

あなたがにしたい場合は、複数の文を実行しますトリガーでは、BEGINENDを使用してください。

トリガ宣言の前後DELIMITER $$を使用する理由は$$;(デフォルト)からデリミタを変更することです。

DELIMITERを変更しなかった場合、トリガーコードの最初のセミコロンは、トリガー宣言の終了として解釈される可能性があります。したがって、続くコードは構文エラーを引き起こす可能性があります。

DELIMITER $$ 
CREATE TRIGGER `discount2` 
BEFORE 
INSERT ON `order_stage` 
FOR EACH ROW 
BEGIN 

    DECLARE alumno INT; 
    DECLARE profesor INT; 
    DECLARE dto decimal(10,2); 
    SET alumno = (SELECT user_id from `order` where `order`.id = NEW.order_id); 
    SET profesor = (SELECT id_profesor from user where user.id = alumno); 
    SET dto = (SELECT descuento from descuentos 
    join user on descuentos.id_profesor = user.id 
    join producto on producto.familia=descuentos.familia 
    where producto.id = NEW.product_id and user.id = profesor); 

    SET NEW.descuento = (SELECT CAST((((dto)*(NEW.pvp))/100) AS DECIMAL(10,2))); 
END; 
$$ 
DELIMITER ; 

続きを読むHere

+0

これは私の(以前の)回答とどこが違うのですか? –

+1

ほぼ同じです。しかし、少し説明があります – jophab

+0

実際になぜ構文エラーが起こったのか(なぜbeginとendキーワードとは別の区切り文字が必要なのか)という説明があった場合、upvoteしますか? – fancyPants

関連する問題