Warm tip: This article is reproduced from serverfault.com, please click

mysql-MariaDB子查询使用整行

(mysql - MariaDB subquery use whole row)

发布于 2020-11-30 15:24:17

通常,子查询比较单个或多个字段,而delete语句通常按ID删除值。不幸的是,我没有ID字段,并且必须对其他类型的表使用通用方法。这就是为什么我要使用使用limit和offset作为解析行的子查询的原因。

我知道这种方法存在风险,但是有什么方法可以通过子查询并比较整个行来删除行吗?

DELETE FROM table WHERE * = ( SELECT * FROM table LIMIT 1 OFFSET 6 )

我正在使用最新版本的MariaDB

Questioner
marius
Viewed
0
dland 2021-01-14 21:49:37

这听起来真的很奇怪,但我要判断谁?:)

我只是依靠主键:

DELETE FROM table WHERE id_table = (SELECT id_table FROM table LIMIT 1 OFFSET 6)

更新:哦,所以你没有主键?你可以通过这种方式加入整行(假设它有五列,分别命名为a,b,c,d,e):

DELETE t
FROM table t
INNER JOIN (
    SELECT a, b, c, d, e
    FROM table
    ORDER BY a, b, c, d, e
    LIMIT 1 OFFSET 6
) ROW6 USING (a, b, c, d, e);

唯一标识行的列的任何子集(例如a,c,d)都可以解决问题(无论如何,你可能都需要将其作为主键)。

编辑:ORDER BY根据The Impaler的出色建议添加了一个子句。这就是你迅速敲一个例子所得到的。