如果找到几个,如何只删除一行?

时间:2013-12-22 11:43:42

标签: sql postgresql

我有一张看起来像这样的表。

CREATE TABLE tshirt
(
  id serial,
  sku character varying(255) NOT NULL
);

我想用我想要的sku只删除一行,但是DELETE FROM tshirt WHERE sku='%s'; 删除具有该sku的所有条目。我怎么能这样做?

6 个答案:

答案 0 :(得分:3)

这会删除除了一个以外的所有内容(这对我来说比删除完全一个更有意义)

DELETE FROM tshirt del
WHERE del.sku = '%s'; 
AND EXISTS (
    SELECT *
    FROM tshirt ex
    WHERE ex.shu = del.shu  -- same shirt
    and ex.id < del.id      -- different number
    );
BTW:为了避免将来遇到这种问题,你应该在表定义中添加一些约束:

CREATE TABLE tshirt
(
        -- surrogate key
  id serial NOT NULL PRIMARY KEY
        -- natural key
  , sku character varying(255) NOT NULL UNIQUE
);

答案 1 :(得分:2)

不是最好的方式,但

DELETE FROM tshirt WHERE id IN(SELECT id FROM tshirt WHERE sku ='%s'LIMIT 1)

答案 2 :(得分:2)

您可以利用每个表中的隐式ctid列。

# create temporary table foo ( x integer );
CREATE TABLE
Time: 4.267 ms
# insert into foo values (1),(2),(3);
INSERT 0 3
Time: 0.549 ms
# delete from foo where ctid = (select ctid from foo limit 1) returning *;
 x
---
 1
(1 row)

DELETE 1
Time: 0.737 ms
# select * from foo;
 x
---
 2
 3
(2 rows)

时间:0.267毫秒

答案 3 :(得分:0)

通过添加其他约束(例如

)告诉您要删除的数据库哪个

DELETE FROM tshirt WHERE sku ='sku_you_like_to_match'和serial ='555';

答案 4 :(得分:0)

尝试使用LIMIT关键字:
DELETE FROM tshirt WHERE sku='%s' LIMIT 1;

答案 5 :(得分:0)

此SQL Server DELETE TOP示例将从lastsname为'Anderson'的employees表中删除第一条记录。如果employees表中还有其他记录的姓氏为“ Anderson”,则它们不会被DELETE TOP语句删除。

DELETE TOP(1)
FROM employees
WHERE last_name = 'Anderson';