【问题标题】:Cannot insert duplicate key row in object 'dbo.CLIENT' with unique index '@KOD_CLIENT'无法在具有唯一索引“@KOD_CLIENT”的对象“dbo.CLIENT”中插入重复的键行
【发布时间】:2014-05-19 09:21:21
【问题描述】:

这是代码:

string CLIENT = "declare @KOD VARCHAR(10) 
                 set   @KOD = 'K' + (SELECT CAST(MAX(SUBSTRING(KOD,3,4)) + 1 as VARCHAR(7)) KOD
                 FROM  CLIENT 
                 WHERE INTERNET='TABLET')";

列 KOD 递增 1,例如 K1、K2、K3,当它达到 K10 时,我尝试添加一行,它显示了这个问题。

无法在具有唯一性的对象“dbo.CLIENT”中插入重复的键行 索引“@KOD_CLIENT”。

KOD列的DataType是varchar(10)

【问题讨论】:

  • 您的实际问题是什么?
  • @GarethD ,当我尝试在表 CLIENT 上添加一行时,KOD 列给了我一个错误。如何修复此代码?我相信你知道我写的那个代码是做什么的。

标签: c# asp.net sql sql-server asp.net-mvc


【解决方案1】:
SELECT CAST(MAX(SUBSTRING(KOD,3,4)) + 1 as VARCHAR(7))

...在字符串上使用MAX,因为字符串按字母顺序排序意味着2 大于10。这会严重扰乱您的编号方案,因为表格中有 2 和 10,您将生成的下一个数字是 3。

你想要的是先转换并在整数上做MAX

SELECT CAST(MAX(CAST(SUBSTRING(KOD,3,4) AS INT)) + 1 AS VARCHAR(7)) 

A simple SQLfiddle to show the difference.

附带说明一下,在数据库中生成您自己的顺序 ID 很少是一个好主意,因为同时写入可能会发生冲突并阻止插入成功。您可能需要重新考虑数字生成并将其基于 - 例如 - 自动增量列。

【讨论】:

  • 它仍然给我同样的错误。 :/ 但是当我从代码中删除'K' + 时,它可以工作。知道为什么吗?
  • @aldoblack 如果您只有一个字符前缀,则需要将子字符串更改为SUBSTRING(2,4),因为您在演员表之前删除了 2 个字符。如果您仍然收到错误,您能否发布一个 sqlfiddle,其中包含一个更实际的示例来显示失败?
  • 是的,我必须这样做 SUBSTRING(2,4) 。谢谢你。现在可以了。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多