编辑:
你的原始设计用于AUTO INCREMENT
列的主键。问题在于,当您看到数据同时进入单独的数据库并最终被合并时,您最终会创建重复的密钥。
一个替代是在每个不同的数据库中使用的序列。不幸的是,序列在mysql中并不是本地可用的(许多其他数据库如Oracle,db2都有它们 - 它们允许这种类型的分布式数据库插入不存在冲突)。 AUTO INCREMENT
列不允许你想要的那种复制。
所以,你剩下两个选项。
1)添加设置location_id的主键的额外部分(按照第一个答案)。
2)或者使用您自己的序列手动插入您的ID,而不是使用AUTO INCREMENT
列。
这也可能是最好的执行顺序作为一个存储过程/函数承诺时,它得到的序列中的下一个值 - 这最终可能不被使用的值。这很好 - 如果您要等待提交序列号直到整个插入提交,那么它比争用要好。
主要的事情是,当你在做第一次插入,您使用的序列号从一个存储过程。当您有效地将数据复制到第二个数据库中时,可以使用源数据库的行中生成的序列#。序列将在每个单独的数据库中保留,以防止冲突。
例如,在每个数据库中,你会想两件:
1),它保存每个命名序列中的下一个可用序列号的表。 (每个获取从序列中抽取的主键的表都会获得一个条目)。 2)一个函数,访问并更新该表格,以及下一个序列号。
实现示例将是:
序列表:
CREATE TABLE sequences (
name varchar(30) NOT NULL,
value int(10) unsigned,
PRIMARY KEY (name)
) ENGINE=InnoDB
序列功能(一个或多个):
delimiter //
create function get_next_value(p_name varchar(30)) returns int
deterministic
sql security invoker
begin
declare current_val integer;
UPDATE sequences
SET value = (@current_val:=value) + 1
WHERE name = p_name;
return @current_val;
end //
delimiter ;
的主要问题是,所存储的函数需要是单一语句,以便它完成并因此立即提交(否则,您将锁定它,这将导致您的事务在订单进入时互相堆叠在一起。如果y你没有很高的吞吐量,这不是一个问题。
我没有写这个功能 - 我从优从这里复制它:http://www.bigdbahead.com/?p=185这里我要提到你,了解更多详情。 (如果这个用户在这里找到我,我会很乐意让他写一个答案,并在这里给他适当的信用)。
现在,对于每一个数据库,您用不同数量的初始化值,以避免冲突。所以,对于orders
表,在位置A,你会用初始化这个:
insert into sequences ('orders', 1);
和B位置,你会初始化这个有:
insert into sequences ('orders', 1000000);
然后在这两个数据库,在插入到orders
,你会怎么做:
insert into orders (order_id, . . .)
select mysql.get_next_value('user_id'), . . . <hardcoded-values>
-
I H还没有对这一解决方案进行道路测试 - 将其作为我在关于序列的回答中所建议的概要。您应该在上面的博客条目链接中进行跟踪,该链接提供了一些更多细节,特别是关于如何在事务控制下进行的工作,请参阅评论(我从注释中获取函数的形式,而不是原始函数) ,当然,在负载下进行测试。
即使我确定我不会遇到碰撞,至少不是在光年之前。然而,分配不同的自动增量根不会解决我的问题。 例如:结构:库存(s_id,s_name)订单(o_id,s_id,金额) 工作空间A插入一个新项目s1,它被分配一个自动增量s1.s_id = 1,然后它与o生成一个订单O. s_id = 1,当它将这两个查询发送到工作区2时,它插入库存s1,并为其分配一个自动增量s1.s_id = 100000,然后执行第二个查询“insert into Orders(s_id)values(1)” 。我认为没有合乎逻辑的解决方案 – Haz 2012-04-14 17:46:26
我的歉意 - 请参阅修订后的答案。我认为在db2条款(我目前的客户),而不是mysql条款。一般来说,是的,这个问题有合乎逻辑的解决方案 - 在Wi-Fi和普及互联网连接之前的日子里,有分布式数据库并且必须稍后合并他们的数据的情况很常见。因此,有很多方案可以避免合并时的冲突。 – 2012-04-14 19:25:44
是的,我很感兴趣。我会感激一个小例子,因为我有点迷路。我会很感激你对我下面想出的想法 – Haz 2012-04-15 09:32:34