0

我有几个数据库,需要在它们之间交换数据。当我从 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”

现在分贝看起来像

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

下一批将是 1001,1002 1003 ...,因此如果需要插入新的 11 条记录,则数据库看起来像

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

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

4

3 回答 3

1

对于遗留系统,除了与它对齐之外,没有更好的方法。我们无法在遗留系统上对其进行更多更改,因此您的第二种方法似乎不错。坦率地说,这并不愚蠢,而且是正确的方法。

于 2013-03-13T11:15:48.130 回答
0

我不完全了解您的数据库交换的内容。

如果您需要来自两个数据库的数据,您可以使用与您的批次类似但使用字符的东西 - A11 和 B11 id。

这样,即使您的数据库增长很多,您也不会发生冲突。

编辑:您还可以使用两个字段创建主键:具有自动增量的整数 ID 和原始数据库名称的 varchar。

于 2013-03-13T10:43:59.910 回答
0

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

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

唯一的要求是您确保主表有足够大的自动增量设置,因此辅助表 id 永远不会达到主表第一个 ID

于 2013-03-13T10:45:22.937 回答