SQL删除行如何使用命令行

记得上次在公司加班到半夜,突然要删除一个表里几百条错误的数据。
我的手一抖,差点把整个桌子都删掉了。
我赶紧用DELETE FROM users WHERE error_code = '1 2 3 '来保存,但还是感觉有点紧张。

SQL中的删除操作其实很简单,但是却有很多陷阱。
例如,如果您使用 DELETE FROM users; 如果不添加任何内容,整个表数据将丢失并且无法恢复。
我见过一个同事这样做,结果所有数据都丢失了。
最后,他不得不在凌晨从备份中恢复。
当时老板的脸就绿了。

多条件删除是基本功,用得频繁的话AND和OR就变得很容易了。
上次检查客户时,我使用了 DELETE FROM Orders WHERE customer_id = 'A1 2 3 ' AND order_date < '2 02 3 -01 -01 '; 一下子就准确删除了,比人工一一检查效率高很多。

模式匹配 LIKE 也常用,如 DELETE FROM users WHERE username LIKE 'j%' AND status = 'inactive'; 可以快速清理一组用户。
不过,要注意效率。
如果表很大,全表扫描会很慢。
上次删除一个1 0万行的大表,使用LIKE卡了半个多小时。
最后改用IN方法批量删除,1 0分钟就搞定了。

事务控制是一个熔断器,BEGIN; 删除; 犯罪; 或回滚; 能在关键时刻挽救生命。
比如你删除了一半的文件,发现误删了,就ROLLBACK即可。
我习惯在删除数据之前先运行SELECT来确认条件是否正确。
上次我这样做避免了一个大陷阱。
删除了2 0条数据后,发现还需要其中一条,于是我赶紧改变条件,再次查看。

批量删除对于大表尤为重要。
例如,使用 DELETE FROM users WHERE id IN (SELECT id FROM (SELECT id FROM users WHERE Registration_date < '2 02 3 -01 -01 ' LIMIT 1 000) AS tmp); 这样每次删除1 000个条目,避免长时间锁定表。

最后还有一个问题:如果表中有自增ID,使用DELETE FROM table WHERE id <= 1 000; 可以直接删除前1 000条吗? 或者我必须使用 LIMIT 或 IN 方法? 必须再试一次。

sql中删除一个视图的命令

上周,一位客户问我如何在 SQL 中删除视图,我直接告诉他 DROP VIEW。
您提到的语法实际上是正确的。
命令 DROP VIEW [schema_name.]view_name;这是标准操作。

但是我最后一次使用Oracle是在2 02 3 年5 月,我发现它并不总是支持CASCADE,我必须先手动删除依赖视图,这很烦人。
MySQL比较好,IF EXISTS和CASCADE都支持。
我在上海某公司的项目中经常使用这个功能,以避免删除错误视图时直接报错。

最大的问题是权限问题。
我记得在 2 02 2 年 1 0 月的一个政府项目中,我没有足够的许可证。
想删除某人的视图,直接报错。
最终,我不得不请求 DBA 授予权限。
因此,运行前最好检查一下是否有DROP权限或者查看所有权。

您提到的尤其正确:删除视图不会删除基础表数据。
上次掉进陷阱的时候,我没有注意。
本以为DROP VIEW会清空表数据,结果结果把2 02 3 年1 月的财务数据全部清空了……还好我发现得及时,不然就得加班重来一遍了。