mysql - 如何防止分支之间的自动递增冲突?
问题描述
假设我在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_id
3sponsors
的发起人角色account_role_id
,每个account_role_id
在检查帐户是否为主持人/发起人时检查 3。显然,当它们合并时,这将导致冲突。
解决此问题的解决方案是什么?我能想到的两个是:
account_role_id
在运行数据库迁移查询后,合并并更新代码以检查是否正确。- 添加我们查询以检索正确的唯一
code
列(基于名称并且希望永远不会冲突)account_role_id
。
解决方案
这是关于活动 SQL 模式和其他 DBMS 代码的事情:它们对源代码控制分支一无所知。
因此,一旦您拥有一个活动数据库,就无法通过部署更改的CREATE TABLE
语句来部署新版本:它会从头开始重新创建一个新的空表。
要更改现有表的定义,例如添加一行,您需要使用ALTER TABLE
语句部署更改。在这种情况下,现有行会保留其自动递增的id
列值,并且任何新行都会获得新值。
在大多数情况下,丢失表的内容是一场灾难。但是,您可能有一些非常小的参考表,您可以在每次发布新版本时从头开始重新创建这些参考表。
明智的开发人员编写 SQL 代码来更新他们的模式,然后在私有、开发和暂存数据库实例上测试该代码。然后,该脚本在部署到生产时在生产数据库上运行一次。
推荐阅读
- python - 如何修复 on_message_edit 错误。消息不应该在那里吗?
- ruby-on-rails - 使用 has_and_belongs_to_many 关联创建新对象
- javascript - 如何根据 id 路由到特定页面?
- javascript - 无法将值添加到数组状态 React
- machine-learning - 为序数神经网络编码我的多类分类问题
- websocket - 我需要使用 jmeter 和 redline 13 加载/性能测试聊天套接字
- android - 应用浏览器中的 React Native url 响应找不到为空
- docker - 关键配置中的流利位变量
- python - 预期的 ASGI 消息“websocket.accept”或“websocket.close”,但得到“http.response.start”
- c++ - 谁在 C++ 中删除了指针(不是用 new 创建的)?