Могу ли я обновить только что добавленную строку, используя триггеры MySQL - PullRequest
4 голосов
/ 20 февраля 2012

Начальное значение по умолчанию для одного столбца в моей базе данных совпадает с автоматически увеличивающимся идентификатором строки. Я пытаюсь использовать триггеры, чтобы установить его.

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW  
BEGIN  
    UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id; 
END

Но это приводит к синтаксической ошибке

# 1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 5

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

Ответы [ 5 ]

8 голосов
/ 20 февраля 2012

Как сказал zerkms, вам нужно изменить разделитель.Но поскольку вы используете только одну строку кода, вам не нужно начинать и заканчивать.Таким образом, вам не нужно менять разделитель либо

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW  
    UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id; 

Поскольку вы получаете ошибку, вы не можете обновить строку, я предлагаю следующее:

НЕ выполнятьобновить запрос на всех.По умолчанию стоимость заказа = значение идентификатора.Поэтому, когда значение заказа меняется, вы можете обновить его должным образом.

Если вы запрашиваете данные с помощью php, сделайте что-то вроде этого:

$order = $row['order'];
if ($order == '')
    $order = $row['id'];

После того, как вам потребуется его обновить, вы получите правильное значение.

7 голосов
/ 20 февраля 2012

Я не думаю, что вы можете сделать это. Триггер AFTER INSERT не может изменить ту же таблицу ни путем выдачи UPDATE, ни чем-то вроде этого:

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW  
    SET NEW.`order` = NEW.id ; 

, что приводит к этой ошибке:

> Error Code: 1362. Updating of NEW row is not allowed in after trigger

Вы также не можете использовать триггер BEFORE INSERT, потому что тогда NEW.id неизвестен (если вы измените вышеприведенное, столбец order получит значение 0 после вставки.


Что вы можете сделать, это использовать транзакцию:

START TRANSACTION ;
  INSERT INTO clusters (id)
    VALUES (NULL);
  UPDATE clusters
    SET `order` = id
    WHERE id = LAST_INSERT_ID();
COMMIT ;
2 голосов
/ 20 февраля 2012

Вы получаете ошибку, потому что mysql рассматривает ; в строке 5 как конец вашего объявления триггера, что, очевидно, приводит к синтаксической ошибке.

Поэтому вам нужно переопределить разделитель, прежде чем указывать тело триггера:

delimiter |

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW  
BEGIN  
    UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id; 
END;
|

delimiter ;
0 голосов
/ 16 августа 2018

Вы можете создать только ДО ВСТАВКИ ТРИГГЕРА, это работает так:

CREATE TRIGGER `default_order_value` 
    BeFORE INSERT ON `clusters` 
    FOR EACH ROW  
    BEGIN  

    SET NEW.`order` = NEW.id ;
    END

То же, что и ниже, мы используем

DELIMITER $$

USE `e_store`$$

DROP TRIGGER /*!50032 IF EXISTS */ `Test`$$

CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `Test` BEFORE INSERT ON `categories` 
    FOR EACH ROW 
BEGIN
   DECLARE vtype   VARCHAR(250) DEFAULT NULL;
   SET vtype = NEW.name;
   IF (NEW.MDNAME IS NULL)
   THEN
    --  SET NEW.MDNAME = 'NA';
   SET NEW.MDNAME=MD5(NEW.name);
   END IF;
END;
$$

DELIMITER ;
0 голосов
/ 26 октября 2014

Это сработало для меня:

CREATE TRIGGER `update_table_2`
AFTER UPDATE ON `table_1`
FOR EACH ROW
UPDATE table2
JOIN table_1
SET table_2.the_column = NEW.the_column
WHERE table_2.auto_increment_field = OLD.auto_increment_field
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...