2017-11-10 19 views
0

MySQLでトリガーを作成する際に問題が発生しました。私の "tb_pessoa"テーブルはユーザーのデータを保存します。私は、新しい挿入が行われたときに、 "tb_email"テーブルにユーザーの電子メールを格納して、それがすでに存在するかどうかをチェックしますが、カーソルでクエリを実行するとき、カーソルは開かれていないと言います。それは何でしょうか?トリガーエラー1326 MySQL

CREATE DEFINER=`root`@`localhost` TRIGGER `db_agenda`.`tb_pessoa_AFTER_INSERT` AFTER INSERT ON `tb_pessoa` FOR EACH ROW 
BEGIN 
    declare id_email, id_tipo_email int(11); 
    declare nm_email varchar(100); 
    declare cr_email cursor for 
    select id_email, nm_email, id_tipo_email 
     from tb_email 
      where nm_email like new.nm_email; 
    declare continue handler for sqlstate '02000' 
    open cr_email; 
    lp_email: loop 
    fetch cr_email into id_email, nm_email, id_tipo_email; 
    if (id_email = null) then 
     insert into tb_email set 
     id_email = (select max(id_email)+1 from tb_email), 
     nm_email = nm_email, 
     id_tipo_email = 1; 
     close cr_email; 
     leave lp_email; 
    end if; 
    end loop lp_email; 
    close cr_email; 
END 
+0

'id_email'は自動インクリメント列ですか? – Barmar

+0

いいえ、サブクエリのmax(id_email)+1で挿入されました –

+0

なぜauto_incrementに変更しないのですか?それが自動的に実行されます。 – Barmar

答えて

1

あなただけのSELECTから値を取得しますINSERTを実行し、カーソルを使用する必要はありません。また

CREATE TRIGGER tb_pessoa_AFTER_INSERT AFTER INSERT ON tb_pessoa 
ON EACH ROW 
    INSERT INTO tb_email (nm_email, id_tipo_email, id_email) 
    SELECT e.nm_email, 1, @id_email := @id_email + 1 
    FROM tb_email AS e 
    CROSS JOIN (SELECT @id_email := MAX(id_email) FROM tb_email) AS i 
    WHERE e.nm_email LIKE NEW.nm_email 

NEW.nm_emailは、任意のワイルドカード文字%_が含まれていない場合は、=代わりのLIKEを使用する必要があります。

+0

良いアイデア、私は考えていなかった、ありがとう(y) –

+0

私がしなければならないのは、id_emailのmax()+ 1を持つサブクエリです –

+0

追加されたすべての行で同じ 'id_email'を使用します。挿入された行ごとにインクリメントする方法を示す答えを更新しました。 – Barmar

関連する問題