目录
1.DROP TABLE
2.DELETE FROM
3.TRUNCATE TABLE
总结
以上为删除表,删除字段(列)语法如下
DDL和DML简述
事务简述
事务四大特性
事务的主要作用
事务的用法
在关系型数据库中,DROP
、DELETE
和 TRUNCATE
都是用来处理数据的 SQL 语句,但它们的目的和效果有所不同
1.DROP TABLE
DROP TABLE table_name;
- 作用:
- 删除整个表结构及其所有数据,包括表的索引、触发器、约束和其他相关对象。
- 执行
DROP TABLE
后,表从数据库中永久移除,不能再访问该表的数据,也无法回滚此操作。 - 如果有其他对象依赖于该表,必须先解除依赖,否则可能会导致删除失败。
2.DELETE FROM
DELETE FROM table_name [WHERE condition];
- 作用:
- 删除表中的某些行或所有行(如果不指定
WHERE
子句,则删除所有行)。 DELETE
是 DML(Data Manipulation Language)语句,执行删除时会在事务日志中记录每一行的变化,因此可以通过事务回滚恢复数据。- 删除操作可以有条件地进行,可以根据指定的条件来决定哪些行应该被删除。
- 删除数据后,表结构依然存在,但所占空间不一定立即回收,可通过
VACUUM
(在PostgreSQL和SQLite中)或DBCC SHRINKDATABASE
(在SQL Server中)等命令来收缩数据库文件大小。 - 删除操作会触发任何关联的删除触发器。
- 删除表中的某些行或所有行(如果不指定
3.TRUNCATE TABLE
TRUNCATE TABLE table_name;
- 作用:
- 清空表中的所有数据,但保留表结构。
TRUNCATE
也是 DDL(Data Definition Language)语句,但在某些数据库系统中它被视为一种特殊类型的 DML 语句。- 与
DELETE
相比,TRUNCATE
更高效,因为它不记录单行删除操作,而是直接清空表数据,因此速度更快,且不会产生事务日志记录(除非在支持事务的环境中启用了特殊的日志选项)。 TRUNCATE
操作不可回滚,也不会触发触发器。- 清空表后,表的自增序列(在支持自动增长的列如 Oracle 的
IDENTITY
或 SQL Server 的IDENTITY
列)会被重置为初始值。 - 表空间会立即回收,对于大型表的快速清空尤其有用。
总结
- 需要彻底删除一个表以及与其相关的所有内容时,使用
DROP TABLE
。 - 想删除表中的一部分数据且希望支持事务回滚和触发器时,使用
DELETE FROM
。 - 要快速清空一个表的所有数据而不关心事务回滚,并且希望尽快释放存储空间且无需触发器干预时,使用
TRUNCATE TABLE
。 -
drop> truncate >delete
以上为删除表,删除字段(列)语法如下
在数据库中删除字段(列)的操作通常只涉及到DDL(Data Definition Language)语句中的 ALTER TABLE
语句,而 DROP
和 DELETE
语句并不直接用于删除字段。
ALTER TABLE 表名 DROP COLUMN 字段(列)名;
这条语句会从对应表中永久删除目标字段。删除字段后,该字段及其所有数据将不再可用,而且这个操作不可逆。
DDL和DML简述
DDL:影响表结构
DML:影响表数据
DDL (数据定义语言): DDL 语句主要用于创建、修改和删除数据库的结构元素,如表、视图、索引、存储过程、触发器等。这些语句定义了数据库的逻辑结构,并不直接影响数据本身。DDL 语句的特点是它们通常是隐式提交的,一旦执行就无法回滚。
常见的 DDL 命令包括:
CREATE
: 创建新的数据库对象,如CREATE DATABASE
、CREATE TABLE
、CREATE INDEX
等。ALTER
: 修改数据库对象的结构,如ALTER TABLE
、ALTER INDEX
等。DROP
: 删除数据库对象,如DROP TABLE
、DROP DATABASE
、DROP INDEX
等。
DML (数据操作语言): DML 语句则是用来查询、插入、更新和删除数据库中的数据。DML 语句作用于数据库的实际内容,允许用户对数据进行各种操作。
常见的 DML 命令包括:
SELECT
: 查询数据库中的数据。INSERT
: 插入新的数据行到表中。UPDATE
: 更新表中已存在的数据行。DELETE
: 删除表中的数据行。
DML 语句可以在事务内执行,并且默认情况下,只有当事务被明确提交 (COMMIT
) 时,所做的更改才会永久保存到数据库中。如果不提交,可以使用 ROLLBACK
命令撤销在事务内的所有更改。而在执行 DDL 语句时,大多数数据库管理系统会自动提交当前事务,即使事务尚未显式提交。这意味着在 DDL 语句执行后,之前的未提交的 DML 变更也会被提交,且 DDL 本身的执行不可回滚。
事务简述
SQL中的事务(Transaction)是一种机制,用于维护数据库操作的完整性、一致性和可靠性。事务是一个不可分割的工作单元,包含了一系列针对数据库的读写操作。在事务管理下,数据库保证这些操作要么全部成功执行,要么全部不执行,即遵循“原子性”原则。
事务四大特性
-
原子性(Atomicity):事务是一个原子操作,事务中的所有操作都必须作为一个整体完成,如果其中一个操作失败,那么整个事务就会失败,之前的所有操作都会被撤销,保持数据库处于一致状态。
-
一致性(Consistency):事务完成后,数据库将处于一致性状态,即事务将数据库从一个有效状态转变为另一个有效状态,遵守所有的业务规则和约束。
-
隔离性(Isolation):并发执行的事务彼此独立,互不影响。即使多个事务同时进行,每个事务看到的数据都是如同其他事务没有同时进行一样的状态。数据库系统通过锁定机制和事务隔离级别来实现这一特性。
-
持久性(Durability):一旦事务提交,它对数据库的修改就被永久保存下来,即使出现系统故障也能保证数据不会丢失。
事务的主要作用
-
数据完整性保护:确保一系列操作在遇到异常时能够恢复至事务开始前的状态,防止因部分操作成功而导致的数据不一致。
-
并发控制:通过事务管理来协调多用户环境下对同一数据的并发访问,避免脏读、不可重复读、幻读等问题。
-
业务流程控制:事务可对应复杂的业务逻辑,确保一系列相关操作要么全部完成,要么全部回滚,符合业务预期。
通过BEGIN TRANSACTION、COMMIT和ROLLBACK等SQL语句,开发者可以手动控制事务的开始、提交和回滚,确保数据库的一致性和可靠性。
事务的用法
START TRANSACTION;
是SQL语句中用来显式开启一个新的数据库事务的命令。在支持事务的数据库系统中,如MySQL、PostgreSQL等,这个命令非常重要,因为它标志着一系列操作的开始,这些操作将被视为一个不可分割的单元,遵循ACID(原子性、一致性、隔离性、持久性)原则。
当发出 START TRANSACTION;
命令后,数据库会开始跟踪该事务内的所有更改,直到事务被提交(COMMIT)或回滚(ROLLBACK)。在此期间,事务内的更改对其他事务可能是不可见的,具体取决于所选择的事务隔离级别。
示例:
--开启一个新事务 start transaction
START TRANSACTION;
-- 执行一系列SQL操作,如INSERT、UPDATE、DELETE等
UPDATE accounts SET balance = balance + 100 WHERE account_id = 1;
INSERT INTO transactions (account_id, amount, type) VALUES (1, 100, 'deposit');
-- 根据业务逻辑判断是否提交事务
IF everything_ok THEN
COMMIT; -- 成功,提交事务,所有更改永久保存
ELSE
ROLLBACK; -- 发生错误,回滚事务,撤销所有更改
END IF;
在没有显示开始事务的情况下执行SQL操作,大多数数据库系统会默认为每条单独的SQL语句自动提交事务,即执行完一条语句就相当于执行了一次COMMIT。而通过 START TRANSACTION;
明确开启事务,可以让开发者手动控制事务的边界,这对于需要执行多个操作并确保它们作为一个整体成功或失败的场景至关重要。