SQL复合主键副本



[vb.net, SQL server 2008 r2, procedure]

我的复合主键有问题。我有一个表:

CREATE TABLE example (
  column1 NUMERIC,
  column2 NUMERIC,
  PRIMARY KEY (column1, column2)
);
1-1
1-2
1-2
2-1
2-2
2-3
3-1
...

但有时用户得到错误…"无法插入重复密钥".

试图找到一个原因…我以以下方式执行插入:

在我的vb.net应用程序中,首先我选择列1的最后数字。在它之后,我加1

例子:

Dim column2 As Integer = 206
// Here I get the last number of column1, and then I add + 1
Dim column1 As Integer = DALExample.GetLastNumber(column2)
// Here I insert the next row
DALExample.Insert(column1 + 1, column2)

我有成千上万的用户,可能有两个以上的用户同时操作,然后他们就得到了错误

我想做什么来解决这个问题:

我不会在我的web应用程序中选择column1的最后值。我会在我的程序中直接做。例子:

INSERT INTO example
    (column1, 
     column2)
SELECT 
    ISNULL(MAX(column1), 0) + 1 FROM example WHERE column2 = 206, 
    206

这样,有翻倍的可能性?(我正在寻找自动增加,但这是不可能的复合主键)有什么更好的方法来做到这一点?

谢谢!

使用给定的语句仍然可以得到重复的键错误。当两个用户同时想要插入时,他们同时执行insert的select查询并得到相同的值。

这里有一些方法来处理这个问题:

  • 锁表。选择最大id。插入数据。解锁表
  • 插入。如果失败,再试一次(一次又一次直到成功)。
  • column1是否有含义?如果是这样,两个用户怎么可能想要插入具有相同含义的记录呢?如果不是,为什么不使用一个序列来获得一个值?

最新更新