【问题标题】:SQL composite primary key duplicateSQL复合主键重复
【发布时间】:2014-08-24 06:13:39
【问题描述】:

[vb.net, sql server 2008 r2, 程序]

我的复合主键有问题。我有一张桌子:

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

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

谢谢!

【问题讨论】:

  • 为什么不使用序列/自动增量数字。?
  • @Blood-HaZaRd 你在一个表上只能有一个标识列
  • 这是一个与其他表相关的链接表吗?请提供更多有关此表中的数据如何与其他表或您的代码相关的上下文。
  • @Tanner column1 不是指向其他表的链接,但 column2 是指向某个表的链接。
  • @guinatal 并且它们中的任何一个都是独一无二的吗?是一对多的关系,在什么方向。请将此信息添加到问题中,因为它将帮助人们回答。

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


【解决方案1】:

您仍然可以使用给定的 Statement 得到重复键错误。当两个用户要同时插入时,他们同时执行插入的选择查询,并返回相同的值。

以下是一些处理方法:

  • 锁定表。选择最大 ID。插入数据。解锁桌子。
  • 插入。如果失败,请再试一次(一次又一次,直到成功为止)。
  • column1 有含义吗?如果是这样,两个用户怎么会想要插入一条意义相同的记录呢?如果不是,为什么不使用序列来获取值?

【讨论】:

  • 您对此100% 确定吗?现在基本上有两个 SQL 语句:一个读取(用于最大数量)和一个写入(插入)。读取是否会在表上获取共享锁,并且根据事务隔离级别,它是否能够从另一个事务中读取插入(在这种情况下,您的答案是否正确,具体取决于所选的隔离级别)?还是将读取视为插入的一部分并获得排他锁,在这种情况下不会出错?
  • @Ronald Wildenberg:只有 99% 的把握。如果没有明确命令,插入不会锁定表。我刚刚查了一下;似乎使用带有WITH(TABLOCK) 的插入语句可以。
  • 只是为了让您知道。我正在同时进行插入和选择(我没有锁定表格),而且我再也没有遇到过这个问题。也许用户没有在同一时间完全插入数据。可能毫秒不同,sql server可以分开。
猜你喜欢
  • 2014-05-25
  • 1970-01-01
  • 2018-06-26
  • 2011-09-21
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多