编程后端开发者

解释DDL和DML命令在SQL中的区别,给出示例,并说明这在实践中如何影响访问权限和事务。

用 Hintsage AI 助手通过面试

答复

DDL (数据定义语言) 是用于定义数据库结构的语言(创建、修改、删除表、架构、索引等):

  • 命令示例:CREATE TABLEALTER TABLEDROP TABLE
  • DDL命令通常会自动提交到数据库中(autocommit),即撤销更改很困难。

DML (数据操作语言) 是处理表中内容的操作语言(添加、修改、删除、查询行):

  • 命令示例:INSERTUPDATEDELETESELECT
  • DML命令通常可以被包裹在事务中,撤销它们是可能的,直到提交。

例如,不同的用户可以仅拥有DML或DDL的不同权限:

  • 普通应用程序通常被禁止使用DDL,以避免意外更改数据库结构;
  • DML被允许用于数据操作。

示例:

-- DDL:创建表 CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100) ); -- DML:插入数据 INSERT INTO users (id, name) VALUES (1, 'Ivan');

带有陷阱的问题

"如果在明确的事务中执行DDL命令(例如DROP TABLE),可以回滚吗?"

大多数数据库管理系统(例如PostgreSQL,Oracle)支持DDL的事务,但许多不允许回滚DDL命令,即使它们明确包裹在事务中。在MySQL中,DDL命令总是立即提交。

示例:
BEGIN; DROP TABLE employees; ROLLBACK;

在大多数情况下,表将永久删除,即使进行了回滚。

由于对主题细微差别的不理解而导致的真实错误示例


故事

在开发环境中意外执行DROP TABLE导致表丢失——该命令无法撤销,即使进行了事务回滚。


故事

组织给予项目管理员权限,导致由于bug大规模修改数据库架构通过ALTER,导致服务长时间停机和订单损失。


故事

拒绝新手的DDL权限,团队忘记了部署迁移的过程需要DDL访问——经过数小时的调查和紧急提升角色,发布失败。