我有一个SQL Server表(如上所示),我使用此命令在我的网站上的表中订购
SELECT *
FROM [user]
ORDER BY idNum DESC;
此表(在我的网站上运行)包含我的数据库保存的所有信息(至少对于[user]表)
我有按钮从信息中删除一行(它获取我要删除的行号),如此屏幕截图所示:
我想问的是有没有办法使用行号删除行?(因为我从按钮点击后得到一个行号我只想删除该行)?
答案 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,
. . .
);
这是您应该用于删除的主键。您不需要向用户显示主键,只要您可以将其与每行相关联即可。
主键因其他原因很重要。通常,使用数据库是因为要存储多个表。主键是如何将不同的表彼此连接(使用外键关系)。