SQL Server:如何删除行号

时间:2018-04-18 11:01:36

标签: sql asp.net sql-server database

Table itself

我有一个SQL Server表(如上所示),我使用此命令在我的网站上的表中订购

SELECT * 
FROM [user]  
ORDER BY idNum DESC;

此表(在我的网站上运行)包含我的数据库保存的所有信息(至少对于[user]表)

我有按钮从信息中删除一行(它获取我要删除的行号),如此屏幕截图所示:

Table on my website

我想问的是有没有办法使用行号删除行?(因为我从按钮点击后得到一个行号我只想删除该行)?

3 个答案:

答案 0 :(得分:1)

你可以在这里使用CTE:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY idNum DESC) rn
    FROM [user]
)

然后使用来自UI的行号删除:

DELETE
FROM cte
WHERE rn = <some value from UI>;

但是很多(大多数?)UI框架,例如Angular可以将用户的整个元数据发送到UI。因此,您通常只能使用直接来自UI中按钮的idNum值进行删除。正如@marc_s刚评论的那样,使用主键删除是一种安全的删除方式。

答案 1 :(得分:0)

您可以使用ROW_NUMBER()

DELETE FROM USER
WHERE idnum IN (SELECT idnum from (SELECT idnum,ROW_NUMBER() OVER(ORDER BY 
idnum desc) AS rw FROM USER) res WHERE res.rw = @rw)

@rw是您的行号

答案 2 :(得分:0)

使用row_number()的方法完全错误。它不是线程安全的 - 可以将另一个用户添加到数据库中,抛弃您向用户显示的所有“行号”。 Gosh,用户加载页面并保持应用程序打开一周,并且在用户开始删除某些内容之前,可能已添加或删除了一堆新用户。

从根本上说,您的表格格式不正确。它没有主键,甚至没有任何唯一约束。

我强烈建议:

create table Users (
    userId int identity(1, 1) primary key,
    . . .
);

这是您应该用于删除的主键。您不需要向用户显示主键,只要您可以将其与每行相关联即可。

主键因其他原因很重要。通常,使用数据库是因为要存储多个表。主键是如何将不同的表彼此连接(使用外键关系)。