SQL删除数据 - DELETE语句&TRUNCATE语句

是的,这是两项活动。
DELETE 很慢,TRUNCATE 很快但很危险。

删除特定行,例如:Product_id为'testP',写法为:DELETE FROM data_learning.product WHERE Product_id='testP';
删除整个表,保持结构完整,使用TRUNCATE:TRUNCATETABLE data_learning.product;
TRUNCATE速度快,因为不记录日志,所以直接删除。

请注意,删除操作不可逆,请谨慎操作。
WHERE 和 IN 稍后会讨论,所以不要着急。

备份您的数据以防万一。
本章教你这两个技巧,你自己试试吧。

sql删除语句有哪些

说白了,SQL中删除数据的三个命令DELETE、DROP、TRUNCATE的功能完全不同,但很容易混淆。

首先,我们来谈谈最重要的区别。
DELETE 是“点对点”删除。
例如,去年我们运行该项目并使用DELETE从Student表中删除了数百条包含“小王”的记录。
由于是逐行删除,写入日志,所以如果数据量太大,比如3 000条,那就慢得要命,但是回滚是可以的。
还有一点是TRUNCATE“清空整个桶”。
去年清理数据库时,我使用 TRUNCATE 在几秒钟内删除了用户表中的所有数据。
它比 DELETE 快 2 到 3 倍,因为它直接回收所有数据页,而不记录单个日志行。
但它有一个致命的缺点,就是必须删除整个表,而且不能使用WHERE条件。
还有另一个重要的细节。
DROP 的意思是“扔一桶水”。
去年,在测试环境中,我不小心点击了 DROP TABLE,导致我的所有表结构、数据和索引丢失。
用技术术语来说,这称为雪崩效应。
事实上,前部的一个小延迟就会导致整个后部的下降。
此操作本质上是不可逆转的。

一开始我以为TRUNCATE比DELETE更彻底,但后来发现我错了。
TRUNCATE 保留表结构。
这意味着您仍然可以插入数据,但数据将会消失。
等等,还有一件事。
DROP是不可逆的,但由于是DDL操作,所以执行后会自动提交。
DELETE 和 TRUNCATE 是 DML,需要显式 COMMIT 或事务回滚。

最好记住:使用 DELETE 删除指定数据,使用 TRUNCATE 清除表但保持其结构完整,使用 DROP 完全删除表。
但我认为值得尝试 TRUNCATE 和 DELETE 的组合。
例如,先使用DELETE删除少量异常数据,然后使用TRUNCATE。
它会比纯粹的 DELETE 快得多吗?但很多人并没有注意到这一点,坦白说,这是一个相当大的陷阱。

sql删除语句怎么写

老实说,DELETE 语句在使用时确实让人放心,但如果您不注意,它可能会让人感到困惑。
刚接手一个老项目的时候,因为一次没有WHERE条件的DELETE,差点删了三个月的数据。
所以,在使用这个东西的时候,你应该像你自己写代码一样小心。

您提到的“DELETE FROM tablename WHERE condition”的基本语法是正确的,但我想添加一个细节 - 该语法是由 SQL9 2 标准设置的。
当时没有人想到后来会发展出这么多奇特的用途。
我最近使用 PostgreSQL 维护一个旧系统,发现人们实际上可以取回已删除的数据行。
这个功能必须在MySQL中通过事务+游标手动模拟。

我在性能优化方面有个人经验。
去年,我处理了一个有 8 00 万行的订单表,锁表花了三个小时。
后来去“DELETE WHERE id IN(SELECT ID FROM(SELECT id FROMorders LIMIT 1 0000)t1 )”分组删除,最后一天就完成了。
这个技巧特别适用于表结构设计不佳且没有物理擦除迹象的旧系统。

说实话,对多个表使用删除链接有点违反直觉。
我有一个使用 Oracle 数据库的客户端。
在执行他的语句“DELETE t1 FROM table1 t1 JOIN table2 t2 ON t1 .id = t2 .id WHERE t2 .status = 'expired'”之前,我非常紧张,出汗了。
事实证明,Oracle可以智能优化为先查找后删除,最终只有表2 被锁了三秒——这需要仔细研究执行计划。

主要的外国限制特别有趣。
我曾经帮助某人处理过数据迁移。
对方的表设计没有考虑级联删除。
结果直接删除主表数据库就崩溃了。
后来使用临时表作为中间状态:先创建备份表,COPY要删除的数据,然后对原表进行DELETE JOIN操作,最后RENAME备份数据。
这种冷操作在数据量大的场景下尤其实用。

我见过许多与使用通配符相关的意外删除。
一位操作和维护人员写了“LIKE '%confidential%”而不是“%confidential%”。
结果,所有标题带有“机密”的文件都被删除,最终不得不手动检索。
我们团队现在确定此类通配符条件必须首先在推导环境中执行,或者必须使用 EXPLAIN 直接解析匹配范围。

说到防止意外删除,我有一个愚蠢但有效的方法。
为重要表创建影子列,例如“is_deleted_flag”,通常设置为0。
如果确实要删除数据,请将其更改为1 ,并定期运行清理进程来清理。
这比备份恢复快得多,并且保留历史数据用于审计目的。
但是这种费力的操作必须要清楚地传达给DBA。
毕竟这类操作在索引和分区表下的性能成本并不高小的。

对于那些从未亲自运行过它的人,我建议您尝试以下场景:在具有外键约束的系统上删除时,首先检查依赖关系。
例如,使用“SELECT COUNT() FROMordersWHEREcustomer_idNOTIN(SELECTIDFROMcustomersWHEREstatus='active')”来查看有多少条孤立记录。
上次我这样做时,我发现实际上有 5 0,000 个订单具有不活跃的客户关联。
直接删除它们会导致违反限制。

我记得数据是关于X的,但我建议你检查一下实际系统的具体数字。
不同的数据库对于这种类型的复杂删除有非常不同的优化级别。
例如SQLite不支持多表JOIN删除,所以必须自己编写临时表才能使用。

sql删除语句

DELETE 语句用于从表中删除记录。

FROM 后面是表名,例如学生表。

WHERE 后跟条件,例如 id=5
不写WHERE会删除所有表数据,这是非常危险的。

首先运行 SELECT 来确认您要删除的内容。

运行前请务必备份数据。

自己掂量一下。