2011-10-12 56 views
0

我在我的MySQL数据库(Drupal内容表,它的价值)中有一个内容表,它有一个自动递增的主键nid。我希望能够实现一个奇数和偶数id解决方案,其中在生产上创建的内容甚至包含id,并且在dev上创建的内容具有奇数id,以便在我同步时避免id冲突。不幸的是,MySQL不支持序列或者每个表的自动增量增量值(即只对db.node增加2,而不是1)。使用触发器在MySQL中的表中伪造自动增量增量

我能想到的最佳解决方案是使用BEFORE INSERT和AFTER INSERT触发器,它在BEFORE INSERT触发器中将auto_increment_increment的会话值设置为2,然后在AFTER INSERT触发器中将其重置为1。由于它只设置会话变量,因此它不应该对其他进程有任何影响,并且由于它是一个Drupal CMS表,并且没有任何复杂的事情发生,所以它看起来很安全,即使它感觉不对。但是,我是一个中级的MySQL管理员(最好:)),正如我所说的那样肯定会感到恶心,所以我想我会把它放在那里,看看是否有人对此有强烈的负面反应,也许我没有预见到一些问题。 (我想如果没有人做,那么也许别人会觉得这很有用)。

+0

你见过这个:? http://stackoverflow.com/questions/2105719/in-a-master-master-setup-what-c​​ommand-or-files-do-i-edit-so-that-it-can-auto-inc –

+0

谢谢你链接,我检查出来,我感到幸运我没有(但)在复制的情况下,看起来很复杂:)。 我希望避免全局改变auto_increment_increment,尽管这肯定会起作用并且是最安全的。我使用Drupal作为前端CMS,但我在Drupal后面做了一些分析,可以这么说,并且希望保持标准设置。可能会这样,但我希望这种触发解决方案是可行的。 再次感谢。 – Isaac

回答

0

这里有你想要做什么一个简单的例子 - 假设有一个整数列“序列” 在“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);