Sql Int自动递增主键和GUID列

Sql Int自动递增主键和GUID列,sql,frameworks,guid,sync,Sql,Frameworks,Guid,Sync,我有一个现有的数据库,其中大多数表都有int主键自动递增 我们现在的处境是,我们现在需要将该数据库用作中央存储,并允许其他客户端连接并同步数据上传/下载 由于主键是自动递增键,我知道存在主键冲突的问题 所以我想我可以给同步的表添加一个全局键——比如GUID 然后创建自定义同步逻辑,查找此GUID/比较客户端 这听起来像是正确的想法吗?关于实现同步框架的任何其他建议,在该框架中,中央数据库上的更改很少没有主键更改一般来说,自动递增键不会发生冲突;事实上,我不知道如何实现它,因为SQL中的大多数定义

我有一个现有的数据库,其中大多数表都有int主键自动递增

我们现在的处境是,我们现在需要将该数据库用作中央存储,并允许其他客户端连接并同步数据上传/下载

由于主键是自动递增键,我知道存在主键冲突的问题

所以我想我可以给同步的表添加一个全局键——比如GUID

然后创建自定义同步逻辑,查找此GUID/比较客户端


这听起来像是正确的想法吗?关于实现同步框架的任何其他建议,在该框架中,中央数据库上的更改很少没有主键更改

一般来说,自动递增键不会发生冲突;事实上,我不知道如何实现它,因为SQL中的大多数定义都包含唯一约束。不过,您可能会出现重复的密钥错误。你为什么让外部供应商决定你的内部密钥是什么?接受他们的完整记录,并自己生成密钥。如果没有键,请将列的大小增加到长。您可以生成一个新的GUID列,是的,但是您可能仍然在生成GUID,那么有什么区别呢


通常,数据库中的大多数表都有多个“唯一”键。这些是“自然”键——组成一组独特数据的实际列;不幸的是,这最终可能是表的整个宽度,这就是为什么要使用id列。另外,除非有一些奇怪的用例,否则不要让服务器知道客户机ID——让客户机知道服务器ID,如果需要,在客户机上的单独一列中跟踪它。然后,他们可以拥有自己的内部ID,在上传之前使用,这些ID与您返回的密钥没有关系,并且他们永远不会与服务器共享

服务器id是基于int还是基于GUID并不重要,尽管我建议您坚持使用现有的服务器id。每当客户机给您一行放在服务器上时,将服务器生成的id返回给他们。这可以防止客户端尝试插入已在使用的id,以及相关问题。您如何知道客户端提供的id不应由其他设备生成?。我想说的是,客户机无法在服务器上指定内部ID

编辑:

根据一些针对HLGEM的快速复制研究,并重新阅读原始问题;我最初认为这个问题是关于让客户机口述内部主键(仍然不好)和/或用GUID替换int主键。尽管您的确切需求可能不需要它,但添加一个额外的GUID列(客户端可以填充该列)是可行的。一些建议: 1将GUID列上意外或恶意的唯一密钥冲突视为业务异常,而不是系统异常。我可能会建议告诉客户端重新生成GUID并以静默方式重新提交。
2客户机永远无法指定数据库中的实际主键列值。事实上,如果您使用GUID列,客户端可能永远不需要知道它们。

您应该查看复制。我不知道这对你是否有帮助。但是复制通常是用guid设置的。

一般来说,自动递增键不会发生冲突;事实上,我不知道如何实现它,因为SQL中的大多数定义都包含唯一约束。不过,您可能会出现重复的密钥错误。你为什么让外部供应商决定你的内部密钥是什么?接受他们的完整记录,并自己生成密钥。如果没有键,请将列的大小增加到长。您可以生成一个新的GUID列,是的,但是您可能仍然在生成GUID,那么区别是什么呢?因为他们将处于一个断开连接的环境中,即在移动设备上,他们拥有自己的数据子集副本,并且能够添加记录-如果添加或更新记录,我需要一种方法来匹配记录-考虑使用GUID进行匹配和更新的原因是什么同步过程。我知道“接受来自他们的已完成记录”的方向,尽管我仍然需要一个匹配的过程-即,我需要为客户返回一些记录-ID不能使用INT,因为它可能会发生冲突-因为我有1000个潜在客户都在自己的子集上进行插入,并在同时中央数据库也经常直接在其上进行插入,数据库中的大多数表将具有多个“唯一”键。这些是“自然”键——组成一组独特数据的实际列;不幸的是,这可能会成为表的整个宽度,这就是id列的原因
都用过了。另外,除非有一些奇怪的用例,否则不要让服务器知道客户机ID——让客户机知道服务器ID,必要时在单独的列中跟踪它。然后,他们可以有自己的内部ID,上传前使用,这与您返回的密钥无关…抱歉,困惑-你在这里说什么?我知道有时候数据会组成一个以上的唯一密钥-即SSN不让服务器知道客户端ID?你对这个伴侣感到困惑吗?关于他们自己的内部ID,是的,他们会有ints自动递增,GUID是客户端和服务器之间的引用-以及客户端ID。我相信他们会在OP给出的场景中发生冲突。。。。我特别指出,客户端不应该为了避免冲突而专门指定服务器ID。如果他们试图重复使用唯一的自然键,这是一个业务问题,而不是系统问题,因此应予以考虑。我开始使用Microsoft Sync Framework,并向同步表中添加列guid以及guid上客户端的现有auto-int主键“-在同步过程中”已同步。这是非常好的工作-同步框架的对象匹配的基础上的GUID的-而现有的数据库代码仍然像往常一样,因为我们仍然有自动递增键