数据库中的 DDL(Data Definition Language,数据定义语言) 用于定义或修改数据库结构(如库、表、索引、约束等)。
数据库中的 DDL(Data Definition Language,数据定义语言) 用于定义或修改数据库结构(如库、表、索引、约束等)。以下是核心 DDL 操作指令及语法详解,适用于主流数据库(MySQL、PostgreSQL、SQL Server、Oracle 等):
一、数据库(Database)操作
1. 创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name
[CHARACTER SET charset_name] -- MySQL 字符集
[COLLATE collation_name]; -- 排序规则
示例:
CREATE DATABASE IF NOT EXISTS company
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
2. 删除数据库
DROP DATABASE [IF EXISTS] database_name;
示例:
DROP DATABASE IF EXISTS old_company;
3. 修改数据库(部分数据库支持)
-- MySQL 修改字符集
ALTER DATABASE company CHARACTER SET utf8;-- SQL Server 修改数据库名
ALTER DATABASE old_name MODIFY NAME = new_name;
二、表(Table)操作
1. 创建表
CREATE TABLE [IF NOT EXISTS] table_name (column1 datatype [constraints],column2 datatype [constraints],...[table_constraints]
);
常用数据类型:
- 整数:
INT
,BIGINT
,SMALLINT
- 小数:
DECIMAL(p,s)
,FLOAT
,DOUBLE
- 字符串:
VARCHAR(n)
,CHAR(n)
,TEXT
- 日期:
DATE
,DATETIME
,TIMESTAMP
- 布尔:
BOOLEAN
(或TINYINT(1)
)
示例:
CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,salary DECIMAL(10,2) DEFAULT 0,hire_date DATE,department_id INT,FOREIGN KEY (department_id) REFERENCES departments(id)
);
2. 删除表
DROP TABLE [IF EXISTS] table_name [CASCADE | RESTRICT];
CASCADE
:级联删除依赖对象(如视图)RESTRICT
:默认,有依赖则拒绝删除
3. 修改表结构
操作类型 | 语法示例 |
---|---|
添加列 | ALTER TABLE table_name ADD COLUMN new_column datatype [constraints]; |
删除列 | ALTER TABLE table_name DROP COLUMN column_name; |
修改列类型 | ALTER TABLE table_name ALTER COLUMN column_name TYPE new_datatype; |
重命名列 | ALTER TABLE table_name RENAME COLUMN old_name TO new_name; |
添加约束 | ALTER TABLE table_name ADD CONSTRAINT constraint_name ...; |
删除约束 | ALTER TABLE table_name DROP CONSTRAINT constraint_name; |
示例:
-- 添加邮箱列
ALTER TABLE employees ADD COLUMN email VARCHAR(100);-- 修改薪资列类型
ALTER TABLE employees ALTER COLUMN salary TYPE DECIMAL(12,2); -- 添加唯一约束
ALTER TABLE employees ADD CONSTRAINT uk_email UNIQUE (email);
三、约束(Constraints)
约束类型 | 语法示例 |
---|---|
主键 | CREATE TABLE ... (id INT PRIMARY KEY) |
外键 | FOREIGN KEY (dept_id) REFERENCES departments(id) |
唯一键 | email VARCHAR(100) UNIQUE |
非空 | name VARCHAR(50) NOT NULL |
检查约束 | salary DECIMAL CHECK (salary > 0) |
默认值 | create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
四、索引(Index)操作
1. 创建索引
CREATE [UNIQUE] INDEX index_name
ON table_name (column1 [ASC|DESC], column2, ...);
示例:
-- 单列索引
CREATE INDEX idx_employee_name ON employees(name);-- 唯一复合索引
CREATE UNIQUE INDEX idx_unique_email ON employees(email, department_id);
2. 删除索引
DROP INDEX index_name ON table_name; -- MySQL
DROP INDEX table_name.index_name; -- SQL Server
五、视图(View)操作
1. 创建视图
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
示例:
CREATE VIEW active_employees AS
SELECT id, name, department
FROM employees
WHERE status = 'active';
2. 修改视图
ALTER VIEW view_name AS
SELECT ...; -- 重新定义查询
3. 删除视图
DROP VIEW [IF EXISTS] view_name;
六、序列(Sequence)操作(Oracle/PostgreSQL)
1. 创建序列
CREATE SEQUENCE seq_name
[START WITH start]
[INCREMENT BY increment]
[MAXVALUE max_value | NOMAXVALUE]
[MINVALUE min_value | NOMINVALUE]
[CYCLE | NOCYCLE];
2. 使用序列
-- 插入数据时调用
INSERT INTO employees (id) VALUES (seq_name.NEXTVAL);
关键注意事项
-
DDL 自动提交
执行 DDL 语句(如CREATE
,ALTER
,DROP
)后事务立即提交,无法回滚(Oracle 部分操作可回滚)。 -
锁表风险
ALTER TABLE
可能锁表导致业务阻塞,大表操作需谨慎。 -
数据库兼容性
- MySQL 不支持修改列名(需用
CHANGE
替代):ALTER TABLE employees CHANGE old_name new_name VARCHAR(50);
- SQL Server 使用
NVARCHAR
替代VARCHAR
支持 Unicode
- MySQL 不支持修改列名(需用
-
命名规范
避免使用保留字(如order
,user
),建议统一大小写和下划线命名(employee_id
)。 -
备份优先
执行破坏性操作(DROP
,TRUNCATE
)前务必备份数据。
综合示例
-- 创建带约束的表
CREATE TABLE departments (dept_id INT PRIMARY KEY AUTO_INCREMENT,dept_name VARCHAR(50) NOT NULL UNIQUE
);-- 修改表添加外键
ALTER TABLE employees
ADD CONSTRAINT fk_dept
FOREIGN KEY (department_id) REFERENCES departments(dept_id)
ON DELETE CASCADE;-- 创建索引加速查询
CREATE INDEX idx_hire_date ON employees(hire_date DESC);-- 删除旧表
DROP TABLE IF EXISTS temp_employees;
熟练掌握 DDL 是数据库管理的核心技能,合理设计表结构和约束能大幅提升数据质量和查询效率。