SQL复合主键重复

时间:2014-07-03 08:09:36

标签: sql sql-server vb.net stored-procedures

[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应用程序中,首先我选择column1的最后一个数字。之后,我加+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)

我有成千上万的用户,可能还有2个用户正在同时进行此操作,然后又出现了错误。

我正在考虑解决此问题:

我不会在我的Web应用程序中选择column1的最后一个值。我将直接在我的程序中完成。例如:

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

这样,有可能加倍吗? (我一直在寻找自动增量,但在复合主键中是不可能的)有没有更好的方法呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

以下是处理此问题的一些方法:

  • 锁定桌子。选择最大ID。插入数据。解开桌子。
  • 插入。如果失败,请再试一次(并一次又一次,直到它起作用)。
  • column1是否具有含义?如果是这样,两个用户如何插入具有相同含义的记录?如果没有,为什么不使用序列来获取值?