2014-03-24 39 views
3

我有一个SQL表用户。它有3列id(设置为主要和身份为是),名称和密码。当我向表中输入数据时,id变大了。但在删除查询时,只有名称和密码将被删除。我需要删除包含id的特定行。 例如:如何用主键ID删除一行?

id:1 name:abc password:123 
id:2 name:wer password:234 
id:3 name:lkj password:222 
id:4 name:new password:999 

我需要删除第三列即ID:3名:密码LKJ:222。但是在删除这一行之后,表格应该如下所示。

id:1 name:abc password:123 
id:2 name:wer password:234 
id:3 name:new password:999 
+4

你是说从the_table是'删除其中id = 42'没有删除该行? –

+1

你可以发布你的删除查询 –

+3

猜测,你是否期待你刚刚删除的'id'值在你插入新行时再次变得可用?如果是这样,那不是'身份'字段的工作方式。一旦使用了一个数字,它就消失了(没有与表格混在一起)。 – Tony

回答

1

从您提供的附加信息可以看出,您不明白IDENTITY数据类型。包括我自己在内的其他人表示,数字不会被重复使用。

您还应该避免仅仅因为行被删除而改变主键。

这似乎你需要一个行号,不要使用此键。创建使用ROW_NUMBER功能的视图,类似

SELECT ROW_NUMBER() OVER (Order by id) AS row_number, name, password, ... 
FROM [Your_Table] 
1

正如@Tony所说,一旦使用了一个数字,它就不再可用了。解决此问题的方法如下:
1.根本不使用标识字段。只使用设置为主键的整数字段。
2.声明每当插入新行时触发的触发器。
3.此触发器必须读取表中最后一个插入行的ID,并将其加1并将结果插入ID字段中。
因此,稍后删除此行时,该ID再次可用。

+2

这样做的问题是,你绝对会杀死任何这样做的表现。如果没有大量的锁定,没有办法做到这一点 - 并且在绝大多数情况下,需要这个ID字段是一个设计错误。这对于用户/密码表来说可能很好,但对于更多的事务活动表来说,它将成为死亡缓慢的一块,因为对表的所有访问都必须被序列化。 – TomTom

+0

@TomTom对于每个解决方案都有一些优点和缺点。最后,你不能回滚身份字段。如果你想拥有这个价值,你根本不用它们。这只是解决问题的一种方式,但它有其缺点:性能和维护。您必须查看您在应用程序和数据库中处理的具体情况。然后你可以决定哪种解决方案适合你。 –

1

如果您想稍后重用该ID,那是一个非常糟糕的主意。不要走那条路。要做到这一点的唯一方法是性能问题,或者在有竞争条件时很容易出错。毕竟,udntities不重用值有一个原因。无论如何,ID应该没有意义。除个人偏​​好之外,通常没有理由不能跳过价值观。但个人偏好不应该优于性能和可靠性。如果你想要这样做,因为你讨厌跳过的值,那就不要。如果你从上面得到这个要求,然后推回去。告诉他们,替代方案更耗时,更不可靠,并且更可能导致数据完整性问题。