То, что вы делаете, играет с огнем.Я не знаю точно, что может пойти не так с вашим триггером (кроме того, что он уже не работает для вас), но у меня есть сильное чувство, что многие вещи могут и будут работать неправильно.Например: что если вы вставите несколько строк в один оператор?Я не думаю, что движок будет обновлять information_schema
для каждой строки.И будет еще хуже, если вы запустите оператор INSERT ... SELECT
.Поэтому использование information_schema
для этой задачи - очень плохая идея.
Однако - первый вопрос: зачем он вообще нужен?Если вам нужно сохранить «идентификатор источника», то вы, вероятно, планируете обновить столбец id
.Это уже плохая идея.И при условии, что вы найдете способ решить вашу проблему - что гарантирует, что originId
не будет изменен вне триггера?
Однако - альтернатива - оставить пустым столбец originId
при вставке.и обновите его в триггере UPDATE.
Предполагая, что это ваша таблица:
create table vcs_test(
id int auto_increment,
origin_id int null default null,
primary key (id)
);
Используйте триггер UPDATE, чтобы сохранить идентификатор источника, когда он изменяется в первый раз:
delimiter //
create trigger vcs_test_before_update before update on vcs_test for each row begin
if new.id <> old.id then
set new.origin_id = coalesce(old.origin_id, old.id);
end if;
end;
delimiter //
Ваш запрос SELECT будет выглядеть примерно так:
select *, coalesce(origin_id, id) as origin_id from vcs_test;
См. Демонстрация на db-fiddle
Вы даже можете сохранитьполная история идентификаторов со следующей схемой:
create table vcs_test(
id int auto_increment,
id_history text null default null,
primary key (id)
);
delimiter //
create trigger vcs_test_before_update before update on vcs_test for each row begin
if new.id <> old.id then
set new.id_history = concat_ws(',', old.id_history, old.id);
end if;
end;
delimiter //
Следующий тест
insert into vcs_test (id) values (null), (null), (null);
update vcs_test set id = 5 where id = 2;
update vcs_test set id = 4 where id = 5;
select *, concat_ws(',', id_history, id) as full_id_history
from vcs_test;
вернет
| id | id_history | full_id_history |
| --- | ---------- | --------------- |
| 1 | | 1 |
| 3 | | 3 |
| 4 | 2,5 | 2,5,4 |
Просмотр на БД Fiddle