gpt4 book ai didi

sql - 两个数据库自动自增偶数和奇数进行同步,不影响自增属性

转载 作者:行者123 更新时间:2023-12-02 04:53:05 27 4
gpt4 key购买 nike

需要快速帮助。我的数据库具有 bigint 自动增量属性。我有两个位置的数据库需要同步。由于 bigint 不是同步的好选择,因为不同站点上可能存在主键副本。我无法继续使用 GUID,因为为此我需要更改我的代码和数据库,这对我来说是不可能的。

现在我只有两个位置用于数据库,所以我想是否可以使我的主键自动增量在一个位置始终为偶数,而在其他位置为奇数。它可以快速解决我的问题。

我如何使用计算列规范或任何其他方式来做到这一点。为了同步,我使用 Microsoft sycn 框架。

如果我在同步后使用identity(1,2) A 服务器或identity(2,2) B 服务器,则会干扰下一个增量值。例如,如果在 A 服务器最大 id 3 和在 B 服务器当前 id 是 4。同步后,A 服务器上的最大 id 现在将是 4。我希望 A 服务器上的新 id 应该仅为 5,但实际上它插入 6。如何才能我解决了这个问题

最佳答案

这是一个非常简单的解决方案,但它仅适用于两台服务器。它无法轻松扩展到更多服务器。

它的好处是它不使用 CHECKIDENT 来重新设定表的种子,并且您无需担心同时运行的事务来获取准确的 MAX > ID 馈入 CHECKIDENT

此外,MSDN 警告 identity property on a column does not guarantee the following:

Consecutive values after server restart or other failures – SQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. This can result in gaps in the identity value upon insert. If gaps are not acceptable then the application should use its own mechanism to generate key values. Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.

如果您选择基于使用 CHECKIDENT 重新播种身份的解决方案,您最好仔细检查它在这种情况下是否正常工作。

此外,要运行CHECKIDENT,您可能需要特定的 permissions :

Caller must own the table, or be a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

解决方案

我的主要想法是,在第一台服务器上使用 IDENTITY(1,1),在第二台服务器上使用 IDENTITY(-1,-1)。而不是试图使 ID 为奇数和偶数,它们将是正数和负数。

这是一个脚本,证明它可以按预期工作,无需任何额外的工作。

-- Sample data
CREATE TABLE #T1 (ID bigint IDENTITY(1,1), V1 int);
CREATE TABLE #T2 (ID bigint IDENTITY(-1,-1), V2 int);

INSERT INTO #T1 VALUES (11);
INSERT INTO #T1 VALUES (12);
INSERT INTO #T1 VALUES (13);
INSERT INTO #T1 VALUES (14);

INSERT INTO #T2 VALUES (21);
INSERT INTO #T2 VALUES (22);
INSERT INTO #T2 VALUES (23);

SELECT * FROM #T1;
SELECT * FROM #T2;

我们从表中的示例数据开始:

#T1
ID V1
1 11
2 12
3 13
4 14

#T2
ID V2
-1 21
-2 22
-3 23

执行同步

-- Insert into T1 new values from T2
SET IDENTITY_INSERT #T1 ON;

MERGE INTO #T1 AS Dst
USING
(
SELECT ID, V2
FROM #T2
) AS Src
ON Dst.ID = Src.ID
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID, V1)
VALUES (Src.ID, Src.V2);

SET IDENTITY_INSERT #T1 OFF;

-- Insert into T2 new values from T1
SET IDENTITY_INSERT #T2 ON;

MERGE INTO #T2 AS Dst
USING
(
SELECT ID, V1
FROM #T1
) AS Src
ON Dst.ID = Src.ID
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID, V2)
VALUES (Src.ID, Src.V1);

SET IDENTITY_INSERT #T2 OFF;

SELECT * FROM #T1;
SELECT * FROM #T2;

同步结果 - 两个相同的表

#T1
ID V1
1 11
2 12
3 13
4 14
-1 21
-2 22
-3 23


#T2
ID V2
-1 21
-2 22
-3 23
1 11
2 12
3 13
4 14

插入更多数据以检查同步后身份的工作方式

-- Insert more data into T1 and T2
INSERT INTO #T1 VALUES (15);
INSERT INTO #T1 VALUES (16);

INSERT INTO #T2 VALUES (24);
INSERT INTO #T2 VALUES (25);
INSERT INTO #T2 VALUES (26);

SELECT * FROM #T1;
SELECT * FROM #T2;

-- Clean up
DROP TABLE #T1;
DROP TABLE #T2;

同步后生成的身份

#T1
ID V1
1 11
2 12
3 13
4 14
-1 21
-2 22
-3 23
5 15
6 16

#T2
ID V2
-1 21
-2 22
-3 23
1 11
2 12
3 13
4 14
-4 24
-5 25
-6 26

您可以看到 T1 中的新身份继续为正,而 T2 中的新身份继续为负。

关于sql - 两个数据库自动自增偶数和奇数进行同步,不影响自增属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28982852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com