2016-11-08 2 views
0

Привет, У меня есть проблема с моим триггером, когда я использую все в одиночку, но вместе нет. Как исправить ошибку синтаксиса?Триггер с двумя блоками IF

CREATE TRIGGER `C_edit` AFTER UPDATE ON `client` 
FOR EACH ROW 
IF OLD.name != NEW.name THEN 
INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name', OLD.id_client, '4', OLD.name, NEW.name); 
END IF; 
IF OLD.name_sql != NEW.name_sql THEN 
INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name_sql', OLD.id_client, '4', OLD.name_sql, NEW.name_sql); 
END IF; 
error: #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 '' at line 4 

ответ

0

Поскольку вы используете несколько операторов внутри тела триггера, вы должны использовать MySQL, begin ... end compound statement syntax, наряду с delimiter заявление, чтобы изменить разделитель:

delimiter // 
CREATE TRIGGER `C_edit` AFTER UPDATE ON `client` 
FOR EACH ROW 
    BEGIN 
     IF OLD.name != NEW.name THEN 
      INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name', OLD.id_client, '4', OLD.name, NEW.name); 
     END IF; 
     IF OLD.name_sql != NEW.name_sql THEN 
      INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name_sql', OLD.id_client, '4', OLD.name_sql, NEW.name_sql); 
     END IF; 
    END// 
delimiter ; 
0

Попробуйте с помощью BEGIN/END блок, как ниже:

DELIMITER $$ 
CREATE TRIGGER `C_edit` AFTER UPDATE ON `client` 
    FOR EACH ROW 
BEGIN 
IF OLD.name != NEW.name THEN 
    INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name', OLD.id_client, '4', OLD.name, NEW.name); 
END IF; 
IF OLD.name_sql != NEW.name_sql THEN 
    INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name_sql', OLD.id_client, '4', OLD.name_sql, NEW.name_sql); 
END IF; 
END $$ 
DELIMITER; 

или без разделитель

CREATE TRIGGER `C_edit` AFTER UPDATE ON `client` 
    FOR EACH ROW 
BEGIN 
IF OLD.name != NEW.name THEN 
    INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name', OLD.id_client, '4', OLD.name, NEW.name); 
END IF; 
IF OLD.name_sql != NEW.name_sql THEN 
    INSERT INTO `change`(`id_user`, `table`, `column`, `id`, `status`, `before`, `now`) VALUES (OLD.id_user_edit, 'client', 'name_sql', OLD.id_client, '4', OLD.name_sql, NEW.name_sql); 
END IF; 
END 

PHPMyAdmin не требует DELIMITER, тогда как MySQL Workbench и другие.

+0

Поскольку вы можете настроить, какой разделитель использовать на phpmyadmin gui и phpmyadmin, устанавливает и сбрасывает разделитель в фоновом режиме для вас. :) – Shadow

Смежные вопросы