Обновление MYSQL Триггер проверяет изменения во всех столбцах и вставляет значения в другую таблицу - PullRequest
1 голос
/ 25 марта 2019

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

CREATE TRIGGER table_a_update BEFORE UPDATE ON table_a
FOR EACH ROW     
BEGIN
   IF (NEW.column1 <=> OLD.column1) 
   THEN
       INSERT INTO table_updates(table, object_id, user_id, column, old_value, new_value)
       VALUES ("table_a",NEW.id, NEW.user_id, "column1", OLD.column1, new.column1)
   END IF;
   IF (NEW.column2 <=> OLD.column2) 
   THEN
       INSERT INTO table_updates(table, object_id, user_id, column, old_value, new_value)
       VALUES ("table_a",NEW.id, NEW.user_id, "column2", OLD.column2, new.column2)
   END IF;
   (other columns... ifs)
END;

Я хочу знать, как я могу получить все столбцы из NEW, чтоесть различия со старыми столбцами, а затем вставьте его, как в этом примере, используя php к тому, что я не знаю:

BEGIN
    for(columns(NEW) as $column){
        IF (NEW.$column <=> OLD.$column)
        THEN
            INSERT INTO table_updates(table, object_id, user_id,column, old_value, new_value)
            VALUES ("table_a", NEW.id, NEW.user_id, $column, $OLD[$column], $NEW[$column])
        END IF;
    }
END;

1 Ответ

0 голосов
/ 26 марта 2019

IIUC:

DELIMITER $$
CREATE TRIGGER before_update_table_a
BEFORE UPDATE ON table_a 
FOR EACH ROW BEGIN

    IF (NEW.col1 <> OLD.col1) THEN
        INSERT INTO table_updates (col1, col2, ... 
        VALUES (OLD.col1, NEW.col2 ...
    END IF;

    IF (NEW.col2 <> OLD.col2) THEN
        INSERT INTO table_updates (col1, col2, ... 
        VALUES (NEW.col1, OLD.col2 ...
    END IF;

    ... 

END $$
DELIMITER ;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...