2016-05-02 6 views
1

Я пытался создать триггер, который может обновлять значение столбца user_count таблицы user_details, используя значение u_count таблицы user_info.Trigger Preventing Record Insertion

CREATE TRIGGER `test` 
AFTER INSERT ON `user_details` FOR EACH ROW 
BEGIN 
    DECLARE default_user_count int(11); 
    SELECT u_count INTO @default_user_count FROM 
    user_info WHERE user_info.id= user_details.id_c; 
    IF user_details.user_count= 0 
     THEN UPDATE user_details SET 
     user_count = default_user_count 
     WHERE user_details.id_c = user_info.id; 
    END IF; 
END 

Trigger успешно сохранены, но когда я попытался вставить значение как в таблице он предотвращает вставить запись в user_details не означает, что ни одна строка вставляется в эту таблицу 2, если удалить триггер, то его работу.

Может ли кто-нибудь сообщить мне об этом с помощью этого триггера?

благодарив, М.

+1

Вы не можете изменять содержимое таблицы в триггере этой таблицы. – Uueerdo

+0

Довольно очевидно, что не так с триггером ... но очень сложно понять, что вы на самом деле пытаетесь сделать, и почему ... Если данные существуют в одной таблице, вы должны обычно извлекать их, когда вам это нужно (позже) с соединением ... не путем его копирования. –

+0

@Michael: У меня нет доступа к основным файлам, поэтому я не могу вносить изменения внутри кода. Вот почему я пытался создать триггер ON AFTER INSERT. – Maverick

ответ

1

Это не совсем понятно, что вы пытаетесь сделать, но это, кажется, как будто это что-то вроде того, что у нас ниже.

В вашем триггере имеются многочисленные ошибки и неоднозначности.

  • Путаница от переменных - DECLARE default_user_count INT(11);не объявить пользовательскую переменную @default_user_count. Он объявляет программную переменную default_user_count. Префикс @ ссылается на совершенно другую область переменных и пространство имен.

  • SELECT и UPDATE из таблицы, в которой сработал триггер обычно не имеет смысла (SELECT) или является недействительным полностью (UPDATE).

  • С помощью триггера вы работаете FOR EACH ROW - то есть для каждой строки, включенной в оператор, вызывающий триггер. Внутри триггера INSERT значения NEW для строки находятся в псевдо-таблице/псевдо-строке, доступной через псевдоним NEW. Для триггеров UPDATE есть NEW и OLD значения строк, а для DELETE триггеры, всего OLD.

  • AFTER INSERT, похоже, не имеет смысла. Я думаю, что вы ищете BEFORE INSERT, то есть при обработке запроса INSERT INTO ..., до вновь вставленная строка фактически записывается в таблицу, соответственно изменяйте ее значения. Полученная строка содержит исходные значения, за исключением случаев, когда триггер модифицировал их.

  • SELECT ... INTO переменная является практикой, вы не должны попасть в привычку, потому что it can bite you in a way a scalar subquery can't, оставляя переменную неожиданно неизмененном вместо того, чтобы установить его в NULL, как можно было бы ожидать. В этом случае это не имело бы никакого значения, но все равно стоит упомянуть ... и в этом случае я полностью исключил эту промежуточную переменную, поэтому подзапрос является единственным вариантом.

Если вы пытаетесь установить значение в этой таблице, используя найденное значение в другой таблице, все, что вам нужно сделать, это SET NEW.column_name равно значению который вы хотите использовать в строке вместо значения, поставляемое с вставить заявление.

CREATE TRIGGER `test` 
BEFORE INSERT ON `user_details` FOR EACH ROW 
BEGIN 
    IF NEW.user_count = 0 /* maybe also >> */ OR NEW.user_count IS NULL /* << this */ THEN 
    SET NEW.user_count = (SELECT ui.u_count 
          FROM user_info ui 
          WHERE ui.id = NEW.id_c); 
    END IF; 
END 

Опять же, неясно, как эти две таблицы связаны на основе содержания исходного вопроса, но это, кажется, делать то, что вы пытаетесь достичь.