sql - Postgres : delete rows order by without primary key

标签 sql postgresql sql-delete

我想删除最近插入的最多“n”行。

例如:

DELETE FROM users 
WHERE user_id = %s AND group_id = %s 
ORDER BY message_date DESC

我知道这是一个语法错误,在网上搜索我发现许多 stackoverflow 答案都告诉我要使用像这样的形式

DELETE FROM users 
WHERE id IN (SELECT id ....)

不幸的是,我在该表上没有主键,它们只是没有自动递增的插入。

我该怎么做?

也许我应该像这样

WITH t AS 
(
    SELECT * 
    FROM users 
    WHERE user_id = %s AND group_id = %s 
    ORDER BY message_date DESC
) 
DELETE FROM t

???

最佳答案

如果您的表没有任何序列 ID(例如,如果存在现有的多列主键),您仍然可以使用 IN 来过滤要删除的行:

DELETE FROM table_name
WHERE (key1, key2) IN (
    SELECT key1, key2 FROM table_name ORDER BY date DESC LIMIT 2
);

对于您的具体情况,您可以使用:

DELETE FROM users 
WHERE (user_id, group_id) IN (
    SELECT user_id, group_id FROM users
    WHERE user_id = %s AND group_id = %s
    ORDER BY message_date DESC
);

关于sql - Postgres : delete rows order by without primary key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46513133/

相关文章:

sql - 在 Snowflake 中解析 JSON

PostgreSQL 和 pgadmin3.exe

postgresql - Jenkins 管道与 docker : run docker as specific user (embedded postgresql

sql - 许多单独更新与一次大型更新的速度

mysql - 从mysql表中删除特定列值的重复行

sql - 数据透视中的 2 个不同聚合

MySQL concat 仅在条件有效时选择

java - Hibernate还是SQL进行删除操作?

java - jOOQ - dao - 插入对象的主键

PHP - 确定数据是否已删除