一、数据库与表对象管理
1. 数据库创建与切换
|----------|--------------------------------------|---------------------------------|
| 操作目的 | 语法示例 | 说明 |
| 创建数据库 | CREATE DATABASE my_database; | 需确保目标路径为空,避免数据覆盖 |
| 切换数据库 | USE my_database; | 切换后所有操作默认在当前数据库下执行 |
| 删除数据库 | DROP DATABASE IF EXISTS my_database; | 加IF EXISTS避免因数据库不存在报错,删除后数据不可恢复 |
2. 数据表核心操作
(1)创建表(含约束与特殊配置)
-- 基础表(含主键、非空约束)
CREATE TABLE employees (
employee_id INT PRIMARY KEY, -- 主键约束(唯一且非空)
first_name VARCHAR(50) NOT NULL, -- 非空约束
last_name VARCHAR(50),
hire_date DATE DEFAULT SYSDATE, -- 默认值(当前日期)
salary DECIMAL(10, 2) CHECK (salary > 0) -- 检查约束(薪资为正)
);
-- 带聚集索引的表(达梦特色,优化查询性能)
CREATE TABLE student (
stuno INT CLUSTER PRIMARY KEY, -- 聚集主键(表数据按该列排序)
stuname VARCHAR(15) NOT NULL,
teano INT,
classid INT
);
-- 临时表(会话/事务结束后数据自动清空)
CREATE GLOBAL TEMPORARY TABLE tmp_emp (
empno INT PRIMARY KEY,
ename VARCHAR(15) NOT NULL,
job VARCHAR(10)
) ON COMMIT DELETE ROWS; -- 事务提交后删除数据
(2)修改表结构
-- 1. 添加列
ALTER TABLE employees ADD department VARCHAR(50);
-- 2. 修改列(数据类型/约束)
ALTER TABLE employees MODIFY salary DECIMAL(12, 2); -- 扩大薪资精度
ALTER TABLE employees MODIFY first_name VARCHAR(60) NOT NULL; -- 调整长度并保留非空约束
-- 3. 删除列
ALTER TABLE employees DROP COLUMN department;
-- 4. 添加约束(唯一键)
ALTER TABLE employees ADD CONSTRAINT uk_emp_name UNIQUE (first_name, last_name);
(3)删除表
-- 普通删除(表不存在时报错)
DROP TABLE employees;
-- 安全删除(表不存在不报错)
DROP TABLE IF EXISTS employees;
-- 级联删除(删除被外键引用的表)
DROP TABLE employees CASCADE;
3. 数据增删改查(DML)
(1)插入数据
-- 单条插入
INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (1, 'John', 'Doe', '2024-01-15', 50000.00);
-- 批量插入
INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES
(2, 'Jane', 'Smith', '2024-02-20', 55000.00),
(3, 'Mike', 'Brown', '2024-03-10', 48000.00);
(2)查询数据(基础 + 高级)
-- 1. 简单查询
SELECT * FROM employees; -- 查询所有列
SELECT first_name, last_name, salary FROM employees; -- 指定列
-- 2. 条件查询
SELECT * FROM employees WHERE salary > 40000 AND hire_date > '2024-02-01';
-- 3. 连接查询(关联部门表)
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id; -- 内连接
-- 4. 分页查询(达梦兼容LIMIT语法)
SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10 OFFSET 20; -- 第21-30条数据
(3)更新与删除数据
-- 更新数据(给2023年前入职员工涨薪5%)
UPDATE employees
SET salary = salary * 1.05
WHERE hire_date < '2023-01-01';
-- 删除数据(删除指定ID员工)
DELETE FROM employees WHERE employee_id = 3;
-- 清空表(快速删除所有数据,不可回滚)
TRUNCATE TABLE employees; -- 比DELETE高效,不产生大量日志
二、视图、存储过程与事务
1. 视图(虚拟表)
-- 1. 创建视图(筛选高薪员工)
CREATE VIEW high_salary_employees AS
SELECT first_name, last_name, salary, department_id
FROM employees
WHERE salary > 50000;
-- 2. 创建只读视图(禁止修改数据)
CREATE OR REPLACE VIEW read_only_emp AS
SELECT first_name, hire_date FROM employees
WITH READ ONLY;
-- 3. 查询视图(与查询表语法一致)
SELECT * FROM high_salary_employees WHERE department_id = 2;
-- 4. 删除视图
DROP VIEW IF EXISTS high_salary_employees;
2. 索引(优化查询性能)
|----------|-------------------------------------------------------------------------|-------------------|
| 索引类型 | 语法示例 | 适用场景 |
| 普通索引 | CREATE INDEX idx_emp_salary ON employees (salary); | 频繁按薪资查询 |
| 复合索引 | CREATE INDEX idx_emp_name_dept ON employees (last_name, department_id); | 多列组合查询(如按姓名 + 部门) |
| 唯一索引 | CREATE UNIQUE INDEX idx_emp_id ON employees (employee_id); | 确保列值唯一(如员工 ID) |
| 函数索引 | CREATE INDEX idx_emp_hire_year ON employees (YEAR(hire_date)); | 按函数结果查询(如入职年份) |
-- 删除索引
DROP INDEX idx_emp_salary;
3. 存储过程与触发器
(1)存储过程(可重复执行的 SQL 集合)
-- 1. 创建存储过程(批量涨薪)
CREATE PROCEDURE increase_salary(
IN dept_id INT, -- 输入参数:部门ID
IN percentage DECIMAL(5, 2) -- 输入参数:涨薪比例(如10表示10%)
)
BEGIN
UPDATE employees
SET salary = salary * (1 + percentage / 100)
WHERE department_id = dept_id;
END;
-- 2. 调用存储过程(给2号部门涨薪10%)
CALL increase_salary(2, 10);
(2)触发器(事件触发自动执行)
-- 1. 先创建审计表(记录薪资变更)
CREATE TABLE salary_audit (
audit_id INT PRIMARY KEY AUTO_INCREMENT,
employee_id INT,
old_salary DECIMAL(10, 2),
new_salary DECIMAL(10, 2),
update_date DATETIME DEFAULT SYSDATE
);
-- 2. 创建触发器(薪资上涨时记录审计日志)
CREATE TRIGGER salary_update_trigger
AFTER UPDATE ON employees -- 员工表更新后触发
FOR EACH ROW -- 行级触发器(每更新一行执行一次)
BEGIN
IF NEW.salary > OLD.salary THEN -- 仅当薪资上涨时记录
INSERT INTO salary_audit (employee_id, old_salary, new_salary)
VALUES (NEW.employee_id, OLD.salary, NEW.salary);
END IF;
END;
4. 事务与锁(保证数据一致性)
(1)事务管理(ACID 特性)
-- 开启事务
START TRANSACTION;
-- 执行操作(如转账:A扣1000,B加1000)
UPDATE accounts SET balance = balance - 1000 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE user_id = 2;
-- 提交事务(所有操作生效)
COMMIT;
-- 若出错,回滚事务(恢复到操作前状态)
-- ROLLBACK;
(2)锁机制(避免并发冲突)
-- 1. 行级锁(仅锁定满足条件的行,影响范围小)
SELECT * FROM employees WHERE employee_id = 1 FOR UPDATE; -- 查询并锁定行,防止其他事务修改
-- 2. 表级锁(锁定整个表,影响范围大,慎用)
LOCK TABLE employees IN EXCLUSIVE MODE; -- 排他锁,禁止其他事务读写
三、连接、备份与参数配置
1. 数据库连接(disql 工具)
达梦默认连接工具为disql,类似 Oracle 的sqlplus,路径在$DM_HOME/bin下:
基本连接语法(用户名/密码@IP:端口)
disql sysdba/Sysdba123@192.168.1.100:5236
本地连接(默认IP和端口可省略)
disql sysdba/Sysdba123
2. 关键参数查询与修改
(1)常用参数查询
-- 1. 查看实例名与版本
SELECT instance_name FROM vinstance;
SELECT \* FROM vversion;
-- 2. 查看兼容模式(是否兼容MySQL/Oracle)
SELECT para_name, para_value FROM v$dm_ini WHERE para_name = 'COMPATIBLE_MODE';
-- 说明:0=不兼容,1=兼容Oracle,2=兼容MySQL
-- 3. 查看密码策略(控制密码复杂度)
SELECT para_name, para_value FROM v$dm_ini WHERE para_name = 'PWD_POLICY';
-- 说明:参数值为策略总和(1=禁止与用户名相同,2=长度≥9,4=含大写字母,8=含数字,16=含特殊符号)
(2)参数修改(达梦模式 vs Oracle 模式)
|-----------|---------------------------------------------------|---------------------|
| 修改方式 | 语法示例 | 适用场景 |
| 达梦模式(推荐) | sp_set_para_value(2, 'COMPATIBLE_MODE', 2); | 修改参数文件(需重启生效) |
| 达梦模式(即时) | sp_set_para_value(1, 'PWD_POLICY', 31); | 同时修改内存 + 参数文件(即时生效) |
| Oracle 模式 | ALTER SYSTEM SET 'PWD_POLICY' = 31 DEFERRED BOTH; | 兼容 Oracle 语法,后续会话生效 |
3. 数据备份(冷备 vs 热备)
(1)冷备(数据库关闭后备份,适用于离线场景)
1. 关闭数据库(确保一致性)
systemctl stop DmServiceXXX
2. 启动备份服务
systemctl start DmAPService
3. 使用dmrman工具备份
cd $DM_HOME/bin
./dmrman
BACKUP DATABASE '/dm8/data/my_database/dm.ini' BACKUPSET '/dm8/backup/cold_backup_202410';
(2)热备(数据库运行中备份,适用于生产环境)
1. 前提:开启归档模式(避免日志循环覆盖)
ALTER DATABASE MOUNT; # 切换到挂载模式
ALTER DATABASE ADD ARCHIVELOG 'dest=/dm8/archive, type=local, file_size=64, space_limit=0';
ALTER DATABASE ARCHIVELOG; # 开启归档
ALTER DATABASE OPEN; # 切换回正常模式
2. 执行热备(在disql中)
BACKUP DATABASE BACKUPSET '/dm8/backup/hot_backup_202410';
4. 用户与权限管理
(1)用户创建与授权
-- 1. 创建用户(指定默认表空间)
CREATE USER chkov
IDENTIFIED BY "Chkov@2024" -- 密码需符合PWD_POLICY策略
DEFAULT TABLESPACE chkov
TEMPORARY TABLESPACE TEMP;
-- 2. 授予权限(常用角色)
GRANT RESOURCE, PUBLIC, VTI TO chkov; -- RESOURCE=创建表权限,VTI=查询动态视图权限
GRANT DBA TO chkov; -- 授予管理员权限(谨慎使用)
-- 3. 查看用户权限
SELECT grantee, granted_role FROM dba_role_privs WHERE grantee = 'CHKOV';
(2)用户状态管理
-- 锁定用户
ALTER USER chkov ACCOUNT LOCK;
-- 解锁用户并重置密码
ALTER USER chkov ACCOUNT UNLOCK IDENTIFIED BY "NewChkov@2024";
5. 日志管理(重做日志与归档)
(1)添加重做日志
-- 达梦无Oracle的"group"概念,直接添加单个日志文件
ALTER DATABASE ADD LOGFILE '/dm8/data/my_database/log3.log' SIZE 256; -- 大小默认单位为M
(2)查看日志状态
-- 查看重做日志信息
SELECT * FROM v$rlogfile;
-- 查看归档日志配置
SELECT * FROM v$dm_arch_ini;
四、常见问题与避坑点
- 参数修改不生效 :需区分参数类型(read only需改配置文件 + 重启,sys类型可即时生效),可通过SELECT para_type FROM v$dm_ini WHERE para_name = 'XXX';查看类型。
- 备份失败 :冷备需关闭数据库 + 启动DmAPService,热备需开启归档模式,否则会提示 "备份条件不满足"。
- 表删除报错 :若表被外键引用,需加CASCADE级联删除,否则会提示 "存在引用约束"。