Фальсификация автоинкремента на таблицу в MySQL с использованием триггера - PullRequest
0 голосов
/ 12 октября 2011

У меня есть таблица содержимого в моей базе данных MySQL (таблица содержимого Drupal, для чего она стоит), которая имеет первичный ключ с автоматическим увеличением, nid. Я хочу иметь возможность реализовать решение для нечетных и четных идентификаторов, в котором контент, созданный в рабочей среде, имеет четные идентификаторы, а контент, созданный в dev, имеет нечетные идентификаторы, чтобы избежать конфликтов идентификаторов при синхронизации. К сожалению, MySQL не поддерживает последовательности или значения приращения для каждой таблицы (например, увеличение на 2 только для db.node, а не 1).

Лучшее решение, которое я могу придумать, - это иметь триггер BEFORE INSERT и AFTER INSERT, который устанавливает значение сеанса auto_increment_increment на 2 в триггере BEFORE INSERT, а затем сбрасывает его на 1 в триггере AFTER INSERT. Так как он только устанавливает переменную сеанса, он не должен оказывать никакого влияния на другие процессы, и, поскольку это таблица CMS Drupal и ничего сложного не происходит, он кажется безопасным, даже если он кажется неправильным.

Тем не менее, я являюсь промежуточным администратором MySQL (в лучшем случае :)), и, как я уже сказал, это, безусловно, кажется хакерским, поэтому я подумал, что я это опубликую и посмотрю, есть ли у кого-нибудь сильные негативные реакции на это, возможно. какая-то проблема, которую я не предвидел. (И я полагаю, что если никто этого не сделает, то, возможно, кому-то это покажется полезным).

1 Ответ

0 голосов
/ 02 мая 2012

Вот простой пример того, что вы хотите сделать - предполагая, что есть целочисленный столбец 'seq' в таблице my_table_name:

DROP trigger my_trigger_name;  

CREATE TRIGGER my_trigger_name
BEFORE INSERT ON my_table_name
FOR EACH ROW
SET NEW.seq = (select ifnull(max(seq)+1,1) from source_table_name);
...