首页 > 解决方案 > 如何防止分支之间的自动递增冲突?

问题描述

假设我在master分支上有以下架构和数据:

CREATE TABLE `account_roles` (
  `account_role_id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `position` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`account_role_id`),
  UNIQUE KEY `name` (`name`),
  KEY `position` (`position`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

INSERT INTO `account_roles` (`account_role_id`, `name`, `position`)
VALUES
    (1, 'Administrator', 1),
    (2, 'User', 2);

在我们的代码中,我们然后检查一个帐户account_role_id以确定他们的角色。

现在假设我们master为两个新功能创建了两个分支,这两个分支都需要一个新的帐户角色。每个分支都会向表中插入一条新记录,account_roles如下所示:

moderators分支:

INSERT INTO `account_roles` (`account_role_id`, `name`, `position`)
    VALUES (NULL, 'Moderator', '3');

sponsors分支:

INSERT INTO `account_roles` (`account_role_id`, `name`, `position`)
    VALUES (NULL, 'Sponsor', '3');

moderators分支现在具有 3 的主持人角色,分支现在具有account_role_id3sponsors的发起人角色account_role_id,每个account_role_id在检查帐户是否为主持人/发起人时检查 3。显然,当它们合并时,这将导致冲突。

解决此问题的解决方案是什么?我能想到的两个是:

  1. account_role_id在运行数据库迁移查询后,合并并更新代码以检查是否正确。
  2. 添加我们查询以检索正确的唯一code列(基于名称并且希望永远不会冲突)account_role_id

标签: mysqlsqlversion-controlbranchauto-increment

解决方案


这是关于活动 SQL 模式和其他 DBMS 代码的事情:它们对源代码控制分支一无所知。

因此,一旦您拥有一个活动数据库,就无法通过部署更改的CREATE TABLE语句来部署新版本:它会从头开始重新创建一个新的空表。

要更改现有表的定义,例如添加一行,您需要使用ALTER TABLE语句部署更改。在这种情况下,现有行会保留其自动递增的id列值,并且任何新行都会获得新值。

在大多数情况下,丢失表的内容是一场灾难。但是,您可能有一些非常小的参考表,您可以在每次发布新版本时从头开始重新创建这些参考表。

明智的开发人员编写 SQL 代码来更新他们的模式,然后在私有、开发和暂存数据库实例上测试该代码。然后,该脚本在部署到生产时在生产数据库上运行一次。


推荐阅读