如何解决数据冲突


How to resolve data confliction

我有几个数据库,需要在它们之间交换数据。当我从db A导出到db B时,会发生Id冲突。我想了两种方法,都没有使我满意。

  1. 选择max(id)然后创建新的id以避免冲突,但一列存储json结构并包含id !(历史原因)。所以我需要创建新的Id(主键)并修改json列中的所有Id

  2. 或者我可以为每个数据导入添加批处理信息。当我导入数据时,我找出sql中的每个id并在它们之前添加批处理id。例如:

原始数据库,如:

ID     COL_JSON
11     {id:11,name:xx ...} 

我想插入一条新记录:11,在插入之后,我在id

之前添加了一个批处理信息"1000"

现在db看起来像

ID     COL_JSON
11     {id:11,name:xx ...}  
100011 {id:100011,name:xx ...}  

下一批将是1001、1002、1003…,所以如果一个新的11记录需要插入db看起来像

ID     COL_JSON
11     {id:11,name:xx ...}  
100011 {id:100011,name:xx ...}  
100111 {id:100111,name:xx ...}  

虽然这两种方法可以解决冲突,但我觉得这两种方法是愚蠢的。有什么优雅的计划吗?

对于遗留系统,除了与其保持一致之外,没有更好的方法。我们不能在遗留系统上做更多的改变,所以你的第2个方法看起来不错。坦率地说,这并不愚蠢,而且是正确的做法。

我不太明白你的数据库交换什么。

如果你需要两个数据库中的数据,你可以使用类似于你的批处理,但使用字符- A11和B11 id。

这样即使你的数据库增长很多也不会有冲突。

编辑:你也可以做一个有两个字段的主键:带有自动增量的整数ID和原始数据库名称的varchar。

当我有一个应该同步的表(不是动态的)时,我使用这种方法:

  • 将被覆盖的主表有一个大的自动增量(即:autoincrement = 100000)
  • 将被合并到主表的副表具有从1开始的正常自动增量。

唯一的要求是确保主表有足够大的自动递增设置,这样二级表id将永远不会到达主表的第一个id