【问题标题】:Faking Auto Increment Increment on a Table in MySQL Using Trigger使用触发器在 MySQL 中的表上伪造自动增量
【发布时间】:2011-12-06 06:41:17
【问题描述】:

我的 MySQL 数据库中有一个内容表(一个 Drupal 内容表,值得一提),它有一个自动递增的主键 nid。我希望能够实现一个奇偶 id 解决方案,其中在生产中创建的内容具有偶数 id,而在开发上创建的内容具有奇数 id,以避免同步时的 id 冲突。不幸的是,MySQL 不支持序列,或每个表的自动增量增量值(即仅对 db.node 增量 2,而不是 1)。

我能想到的最佳解决方案是使用 BEFORE INSERT 和 AFTER INSERT 触发器,在 BEFORE INSERT 触发器中将 auto_increment_increment 的会话值设置为 2,然后在 AFTER INSERT 触发器中将其重置为 1。由于它只设置会话变量,它不应该对其他进程产生任何影响,而且由于它是一个 Drupal CMS 表并且没有发生任何复杂的事情,所以它看起来很安全,即使感觉不对。

但是,我是一名中级 MySQL 管理员(充其量是 :)),正如我所说,这肯定让人觉得很老套,所以我想我会把它放在那里,看看是否有人对此有任何强烈的负面反应,也许一些我没有预见到的问题。 (我想如果没有人这样做,那么也许其他人会觉得这很有用)。

【问题讨论】:

  • 你见过这个吗:? stackoverflow.com/questions/2105719/…
  • 感谢您的链接,我检查了它,我很幸运我(尚未)处于复制情况,看起来很复杂:)。我希望避免全局更改 auto_increment_increment,尽管这肯定会起作用并且是最安全的。我正在将 Drupal 用于前端 CMS,但可以说是在 Drupal “背后”做一些分析工作,并希望将标准设置保留在那里。可能会这样,但我希望这个触发解决方案是可行的。再次感谢。

标签: mysql drupal-6 triggers sync auto-increment


【解决方案1】:

这是您想要做的一个简单示例 - 假设有一个整数列 '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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2020-05-09
    • 1970-01-01
    • 2012-04-17
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多