ERROR 1064 (42000): check the manual that corresponds to your MySQL server version for the right syntax to use near 'END'

时间:2016-04-07 10:43:37

标签: mysql delimiter

here is mycode

i am trying to create a trigger after insert on a table say product table to a change traker table called audit table

like this

    DELIMITER //
    CREATE TRIGGER product_table_after_insert
    AFTER INSERT
    ON product_table FOR EACH ROW

   BEGIN

    DECLARE l_product_description varchar(500);
    DECLARE l_product_number int;
   set @l_table_name = 'product_table';
    set @l_action = 'INSERT';
   set  @l_table_column = 'all columns';
   set   @l_description = 'new row inserted';

    select p.product_description ,p.product_number into @l_product_description, @l_product_number from product_table p where p.product_description = (select max(pg.product_number)from product_table pg);
   -- Insert record into audit table
       INSERT INTO audit_table_test
     ( table_name,
     changed_row_id,
     action,
     table_column,
     change_desciption,
     change_time
     )
     VALUES
     ( l_table_name,
      l_product_number,
      l_action,
      l_table_column,
      l_description,
       SYSDATE()
       )
   END
   //
    DELIMITER ;

this is the error i am getting

i tried all these ways

used | ,S etc instead of // and

removed ; after end, placed // or \ or $$ together and below end

nothing works, some one please help me

ERROR 1064 (42000): 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 'END' at line 32

some one please help me

2 个答案:

答案 0 :(得分:1)

The solution provided by @juergen in comments is working fine, that is, Add a ; after the insert statement (before the END) Thanks for finding my mistake. I was looking for it for about 4 hours so Answer is here:

DELIMITER //
CREATE TRIGGER product_table_after_insert
    AFTER INSERT
    ON product_table
    FOR EACH ROW

  BEGIN

    DECLARE l_product_description varchar(500);
    DECLARE l_product_number int;
    set @l_table_name = 'product_table';
    set @l_action = 'INSERT';
    set @l_table_column = 'all columns';
    set @l_description = 'new row inserted';

    select p.product_description ,p.product_number
      into @l_product_description, @l_product_number
      from product_table p
      where p.product_description =
        (select max(pg.product_number)
          from product_table pg);
    -- Insert record into audit table
    INSERT INTO audit_table_test
        ( table_name,
          changed_row_id,
          action,
          table_column,
          change_desciption,
          change_time
        )
      VALUES
        ( l_table_name,
          l_product_number,
          l_action,
          l_table_column,
          l_description,
          SYSDATE()
        );  //<<---- Semicolon needed to be here
  END
  //
DELIMITER;

答案 1 :(得分:1)

  1. Place sql terminator ";" after create table statement
  2. remove ";" after end delimeter.

So your code should be as per below,

 DELIMITER //
    CREATE TRIGGER product_table_after_insert
    AFTER INSERT
    ON product_table FOR EACH ROW

    BEGIN

    DECLARE l_product_description varchar(500);
    DECLARE l_product_number int;
    set @l_table_name = 'product_table';
    set @l_action = 'INSERT';
    set  @l_table_column = 'all columns';
    set   @l_description = 'new row inserted';

    select p.product_description ,p.product_number into @l_product_description, @l_product_number from product_table p where p.product_description = (select max(pg.product_number)from product_table pg);
   -- Insert record into audit table
       INSERT INTO audit_table_test
     ( table_name,
     changed_row_id,
     action,
     table_column,
     change_desciption,
     change_time
     )
     VALUES
     ( l_table_name,
      l_product_number,
      l_action,
      l_table_column,
      l_description,
       SYSDATE()
       );
   END
   //
    DELIMITER