SQLite中LIKE子句搭配DELETE语句无法生效问题求助
DELETE用LIKE删不了数据但SELECT能查到?试试这几个排查点
先确认事务有没有提交
很多数据库(比如MySQL InnoDB、PostgreSQL)默认不会自动提交事务。你执行完DELETE后,得手动提交才能让修改生效。用Python的话,执行完SQL后要加一行conn.commit():cur.execute("DELETE FROM urls WHERE url LIKE 'https%';") conn.commit() # 必须加这个,不然修改只会在当前会话临时生效,关闭就回滚你之前能查到数据,可能是因为当前会话还没提交,数据处于未确认状态,实际没被删除。
检查LIKE的大小写匹配问题
有些数据库的LIKE是大小写敏感的,比如PostgreSQL默认区分大小写。如果你的url里有HTTPS://xxx这种大写开头的,'https%'就匹配不到,但SELECT可能因为你用了不区分大小写的配置才查到。可以改成不区分大小写的写法:-- MySQL 强制不区分大小写 DELETE FROM urls WHERE url LIKE 'https%' COLLATE utf8_general_ci; -- PostgreSQL 直接用ILIKE DELETE FROM urls WHERE url ILIKE 'https%';看看url字段有没有隐藏字符
有时候url开头可能有空格、制表符这类看不见的字符,导致LIKE 'https%'匹配不到,但SELECT显示的时候你看不到这些字符。可以先查一下字段的实际长度:SELECT url, LENGTH(url) FROM urls WHERE url LIKE 'https%';如果长度比你看到的长,说明有隐藏字符,这时候可以用TRIM处理后再匹配:
DELETE FROM urls WHERE TRIM(url) LIKE 'https%';确认操作的是同一个表
别小看这个,有时候可能不小心连了不同的数据库,或者表名大小写搞错了(比如Urls和urls在区分大小写的数据库里是两个不同的表),导致DELETE和SELECT操作的不是同一批数据。
内容的提问来源于stack exchange,提问作者Matblanket
相关产品推荐
相关产品推荐

