2016-03-19 2 views
0

Я просто перешел на phymysql, и у меня возникли проблемы с созданием триггера. Ниже мой сценарийmysql insert trigger error

CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 

    DECLARE var1 INT; 
    DECLARE var2 INT; 
    DECLARE var3 CHAR(100); 
    DECLARE var4 CHAR(100); 
    DECLARE var5 CHAR(3); 

    SELECT  profile_id, 
       profile_id, 
       fname, 
       fname, 
       fpage 
     FROM profile 
     INTO var1, 
       var2, 
       var3, 
       var4, 
       var5; 

    IF var5 = 'yes' 
    THEN 

     INSERT INTO fiends 
       (req_id, resp_id, req_name, resp_name, fpage) 
      VALUES 
       (var1, var2, var3, var4, 'yes'); 

    END IF; 

END 

Когда я исполняю я получаю эту ошибку

#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 5 

Любая помощь будет моя оценена.

+0

spencer7593 поднявших хороший момент, который привел меня, чтобы удалить мой первый ответ. Мои вопросы для вас: Какова цель этого триггера? и какой клиент базы данных вы используете? –

+0

Я думаю, что есть несколько вопросов. Я обратился к большинству из них в мой ответ. Не указано, какой клиент вы используете, как вы создаете триггер. Некоторые клиенты GUI могут иметь редактор «create trigger», который автоматически обрабатывает разделители для вас. Я предлагаю вам развить триггер поэтапно. В качестве первого этапа я бы рекомендовал начать с триггера с почти пустым, почти ничего, тела. А потом постройте оттуда. – spencer7593

+0

Как следующий этап, вам нужно определить, что должен делать ваш триггер. Строка комментария или два, указывающая на назначение триггера, не повредит. Знать, что вы хотите, чтобы запустить триггер, - это долгий путь к его написанию. Из ответов вы можете видеть, что мы с Гордоном ушли с совершенно разными представлениями о том, что пытался совершить триггер. – spencer7593

ответ

0

Типичный способ сделать это в MySQL использует :=:

SELECT var1 := profile_id, 
     var2 := profile_id, 
     var3 := fname, 
     var4 := fname, 
     var5 := fpage 
FROM profile; 

На мой взгляд, предложение into есть быть похожа на Oracle.

Тем не менее, две вещи, чтобы отметить:

  1. Это, кажется, предположить, что profile имеет только один ряд. Обычно будет пункт where.
  2. Вы должны указать свои переменные префиксом (скажем v_), чтобы они не путались с столбцами.

Однако я пишу это без переменных:

DELIMITER $$ 
CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 
    INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage) 
     SELECT profile_id, profile_id, fname, fname 
     FROM profile p 
     WHERE fpage = 'yes'; 
END$$ 
DELIMITER ; 

Это кажется намного проще. Я предполагаю, что yes должен быть строкой.

EDIT:

Если вы хотите строки просто вставленные, используйте new:

DELIMITER $$ 
CREATE TRIGGER trgAutoInsert AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 
    INSERT INTO fiends(req_id, resp_id, req_name, resp_name, fpage) 
     SELECT new.profile_id, new.profile_id, new.fname, new.fname 
     FROM dual 
     WHERE new.fpage = 'yes'; 
END$$ 
DELIMITER ; 
+0

Похоже, у этого есть потенциал, чтобы создать много повторяющихся строк в 'fiends'. Ничего недействительного с этим, но я подозреваю, что в OP trigger, 'SELECT ... FROM profile 'был попыткой OP получить значения из строки, которые были только что вставлены. Я подозреваю, что действительно нужен OP ..: NEW.profile_id,: NEW.fname,: NEW.fpage. Но это всего лишь предположение ... вопрос не указывает ожидаемый результат при запуске триггера. – spencer7593

+0

@ spencer7593. , , Это очень хороший момент. –

+0

Acckk ... мой Oracle показывает. Я использовал двоеточия перед NEW. Конечно, MySQL не использует только «NEW», а не стиль Oracle: NEW. ». (Мне все еще интересно, почему мы вставляем таблицу под названием «fiends». Я подозреваю, что наш профиль связан с нашими «друзьями». И не все мои друзья - изверги. – spencer7593

0

Я подозреваю, что проблема с разделителем заявление; Я подозреваю, что он по-прежнему установлен на символ с запятой.

Так как триггер содержит точку с запятой, чтобы получить «создать триггер» заявление для запуска в качестве одной единицы, вы должны изменить разделитель в строку, которая не возникает в любом месте «триггера создать» заявление

Например:

-- change the statement delimiter to something other than semicolon 
DELIMITER $$ 

-- execute the "create trigger" statement containing semicolons 
CREATE TRIGGER ... 
BEGIN 
    ... ; 
    ... ; 
    IF (...) THEN 
     ... ; 
    END IF; 
    ... ; 
END$$ 
-- the occurrence of the $$ delimiter on the line above ends the statement 

-- change the delimiter back to semicolon 
DELIMITER ; 

Кроме того, я думаю, триггер не допускается, чтобы выбрать из той же таблицы, которая была только что вставили в. (Я знаю, что это ограничение для триггеров FOR EACH ROW в Oracle, я должен был бы проконсультироваться с Справочным руководством MySQL, чтобы убедиться ... есть раздел «Ограничения на хранимые программы mysql», процедуры являются наиболее либеральными, функции те же ограничения, что и процедуры, плюс больше, и триггеры имеют те же ограничения, что и функции, плюс больше.

Кроме того, когда этот триггер выполняется (если разрешено выбирать из той же таблицы), этот оператор SELECT, скорее всего, возвращаем более одной строки. С формой INTO мы ожидаем не более одной строки для возврата.

Если целью является ссылка на значения строки, которая была только что вставлена, и использовать их в вставке в другую таблица fiends (или friends?) использовать форму NEW.column_name ссылаться на значения

Например:

DELIMITER $$ 

CREATE TRIGGER profile_ai 
AFTER INSERT ON profile 
FOR EACH ROW 
BEGIN 
    IF (NEW.fpage = 'yes') THEN 
     -- are some of your friends fiends ? 
     INSERT INTO fiends 
     (req_id 
     , resp_id 
     , req_name 
     , resp_name 
     , fpage 
     ) VALUES 
     (NEW.profile_id 
     , NEW.profile_id 
     , NEW.fname 
     , NEW.fname 
     , 'yes' 
     ); 
    END IF; 
END$$ 

DELIMITER ;