DM8数据定义语言(DDL)

 表管理

 创建表

-- 基本CREATE TABLE语法
/*
CREATE TABLE table_name (
column1 datatype [constraints],
column2 datatype [constraints],
...
[table_constraints]
) [TABLESPACE tablespace_name];
*/

-- 创建表示例
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY, -- 主键约束
name VARCHAR2(50) NOT NULL, -- 非空约束
email VARCHAR2(100) UNIQUE, -- 唯一约束
hire_date DATE DEFAULT SYSDATE, -- 默认值
salary NUMBER(8,2) CHECK (salary > 0), -- 检查约束
department_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) -- 外键约束
REFERENCES departments(department_id)
) TABLESPACE users;

-- 创建表时添加注释
COMMENT ON TABLE employees IS '公司员工信息表';
COMMENT ON COLUMN employees.employee_id IS '员工编号,主键';
COMMENT ON COLUMN employees.name IS '员工姓名';

-- 基于查询创建表
CREATE TABLE emp_dept_10
AS
SELECT
e.employee_id,
e.name,
e.salary,
d.department_name
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id
WHERE
e.department_id = 10;

修改表

-- 添加列
ALTER TABLE employees
ADD (middle_name VARCHAR2(30),
nickname VARCHAR2(20) DEFAULT '无名');

-- 修改列定义
ALTER TABLE employees
MODIFY (email VARCHAR2(150),
salary NUMBER(10,2));

-- 删除列
ALTER TABLE employees
DROP COLUMN nickname;

-- 重命名列
ALTER TABLE employees
RENAME COLUMN name TO full_name;

-- 添加约束
ALTER TABLE employees
ADD CONSTRAINT emp_salary_min CHECK (salary >= 3000);

-- 禁用/启用约束
ALTER TABLE employees
DISABLE CONSTRAINT emp_salary_min;

ALTER TABLE employees
ENABLE CONSTRAINT emp_salary_min;

-- 删除约束
ALTER TABLE employees
DROP CONSTRAINT emp_salary_min;

-- 重命名表
ALTER TABLE employees
RENAME TO staff;

删除表

-- 基本DROP TABLE语法
DROP TABLE employees;

-- 带约束的删除
DROP TABLE departments CASCADE CONSTRAINTS; -- 级联删除依赖的约束

-- 清空表数据但保留结构
TRUNCATE TABLE temp_employees;

索引管理

创建索引

-- 创建普通索引
CREATE INDEX idx_emp_name ON employees(name);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_emp_email ON employees(email);

-- 创建复合索引
CREATE INDEX idx_emp_dept_sal ON employees(department_id, salary DESC);

-- 创建函数索引
CREATE INDEX idx_emp_name_upper ON employees(UPPER(name));

-- 位图索引(适合低基数列)
CREATE BITMAP INDEX idx_emp_gender ON employees(gender);

-- 分区索引
CREATE INDEX idx_emp_hire_date ON employees(hire_date)
GLOBAL PARTITION BY RANGE (hire_date) (
PARTITION p_2020 VALUES LESS THAN (TO_DATE('2021-01-01', 'YYYY-MM-DD')),
PARTITION p_2021 VALUES LESS THAN (TO_DATE('2022-01-01', 'YYYY-MM-DD')),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);

管理索引

-- 重建索引
ALTER INDEX idx_emp_name REBUILD;

-- 重命名索引
ALTER INDEX idx_emp_name RENAME TO idx_employee_name;

-- 监控索引使用
ALTER INDEX idx_emp_name MONITORING USAGE;

-- 查看索引使用情况
SELECT * FROM v$object_usage WHERE index_name = 'IDX_EMP_NAME';

-- 删除索引
DROP INDEX idx_emp_name;

视图管理

创建视图

-- 基本视图
CREATE VIEW v_emp_dept AS
SELECT
e.employee_id,
e.name,
e.salary,
d.department_name
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id;

-- 带检查选项的视图(确保通过视图的修改满足视图定义)
CREATE VIEW v_emp_10 AS
SELECT * FROM employees WHERE department_id = 10
WITH CHECK OPTION;

-- 只读视图
CREATE VIEW v_emp_sal_readonly AS
SELECT
department_id,
AVG(salary) avg_sal,
MAX(salary) max_sal,
MIN(salary) min_sal
FROM
employees
GROUP BY
department_id
WITH READ ONLY;

-- 物化视图(预计算并存储结果)
CREATE MATERIALIZED VIEW mv_emp_sal_summary
REFRESH COMPLETE ON DEMAND
AS
SELECT
department_id,
COUNT(*) emp_count,
SUM(salary) total_sal,
AVG(salary) avg_sal
FROM
employees
GROUP BY
department_id;

管理视图

-- 修改视图
CREATE OR REPLACE VIEW v_emp_dept AS
SELECT
e.employee_id,
e.name,
e.salary,
d.department_name,
l.city
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id
JOIN
locations l ON d.location_id = l.location_id;

-- 重编译视图
ALTER VIEW v_emp_dept COMPILE;

-- 删除视图
DROP VIEW v_emp_dept;

-- 刷新物化视图
BEGIN
DBMS_MVIEW.REFRESH('mv_emp_sal_summary', 'C');
END;
/

阅读剩余
THE END