Могу ли я обновить только что добавленную строку, используя триггеры MySQL



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



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




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

774   5  

5 ответов:

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

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'];

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

Я не думаю, что ты сможешь это сделать. Триггер 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 ;

Вы получаете ошибку, потому что 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 ;

Вы можете создать непосредственно перед вставкой триггера, это работает следующим образом:

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 ;

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

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

Comments

    Ничего не найдено.