达梦数据库的常用操作
·
达梦数据库的常用操作
达梦数据库(DM)作为国产关系型数据库的代表,其日常操作围绕表、字段、索引等基础对象展开,同时结合表空间管理、数据库状态查询、权限管理等核心运维能力,形成完整的操作体系。本文在原有基础操作的基础上,补充操作说明、扩展用法、运维查询、表空间管理等内容,让操作更具实用性和完整性。
一、检查数据库表是否存在
基础语句
select * from all_Objects where owner ='TEST' and object_type='TABLE' and Object_name like '%HC%';
补充说明
owner:表的所属用户,需大写(达梦默认对象名大小写敏感,若创建时加双引号则按原大小写匹配);object_type:除TABLE外,还可查询VIEW(视图)、INDEX(索引)、PROCEDURE(存储过程)等对象;- 精准查询:取消模糊查询可直接匹配表名,语句:
select * from all_Objects where owner ='TEST' and object_type='TABLE' and Object_name ='HC_TABLE';
- 当前用户表查询:若查询登录用户下的表,可简化为
select * from user_tables where table_name like '%HC%';,无需指定owner。
二、查看建表语句
基础语句
select DBMS_METADATA.GET_DDL('TABLE','数据库表') from dual;
补充扩展
- 指定所属用户:查询其他用户的表建表语句,需在表名后拼接用户,语句:
select DBMS_METADATA.GET_DDL('TABLE','USER','TEST') from dual;
- 格式化输出:默认输出可能存在换行混乱,可通过设置参数格式化,语句:
SET LINESIZE 200; -- 设置行宽
SET PAGESIZE 0; -- 取消分页
select DBMS_METADATA.GET_DDL('TABLE','USER','TEST') from dual;
- 查看视图/索引建语句:替换
TABLE为VIEW/INDEX即可,例如查看视图建语句:
select DBMS_METADATA.GET_DDL('VIEW','V_USER_INFO','TEST') from dual;
三、新增字段
基础语句
alter table "user" add column("is_del" CHAR(1));
comment on column "user" ."is_del" is '删除标志,1是0否';
补充说明
- 批量新增字段:无需多次执行
alter table,可一次性新增多个字段,语句:
alter table "user" add (
"is_del" CHAR(1) comment '删除标志,1是0否',
"create_time" DATETIME comment '创建时间',
"update_time" DATETIME comment '更新时间'
);
- 设置字段默认值:新增字段时可直接指定默认值,避免后续更新,语句:
alter table "user" add column("is_del" CHAR(1) default '0');
comment on column "user" ."is_del" is '删除标志,1是0否,默认0未删除';
- 非空约束:新增必填字段时添加
not null约束,语句:
alter table "user" add column("user_code" VARCHAR(50) not null);
comment on column "user" ."user_code" is '用户编码,非空唯一';
四、重命名字段名称
基础语句
alter table "user" rename column "name" to "user_name";
注意事项
- 重命名前需确认无业务程序正在使用该字段,避免程序报错;
- 若字段存在索引、触发器、存储过程依赖,重命名后需同步修改依赖对象;
- 达梦数据库中,若表名/字段名未加双引号,默认大写,重命名时需保持一致,例如:
-- 无引号创建的表,重命名语句
alter table USER rename column NAME to USER_NAME;
五、修改字段
基础语句
-- 设置字段可为空
ALTER TABLE "USER" MODIFY "CREATER_ID" NULL;
-- 修改字段长度
ALTER TABLE "USER" MODIFY USER_NAME VARCHAR(150);
-- 修改字段类型(慎用)
alter table "USER" modify DFQZ int;
补充扩展
1. 核心修改操作
-- 设置字段非空(需确保字段无NULL值,否则执行失败)
ALTER TABLE "USER" MODIFY "CREATER_ID" NOT NULL;
-- 设置字段默认值
ALTER TABLE "USER" MODIFY "is_del" CHAR(1) default '0';
-- 同时修改字段长度+默认值+注释(注释需单独执行)
ALTER TABLE "USER" MODIFY "user_name" VARCHAR(200) default '未知';
comment on column "USER"."user_name" is '用户姓名,长度200,默认未知';
2. 慎用说明
- 修改字段类型时,若字段已有数据,可能导致数据丢失或转换失败(如字符串转数字),建议先备份数据再操作;
- 缩短字段长度时,需确保现有数据长度均小于新长度,否则执行失败。
六、索引
基础语句
-- 创建普通索引
CREATE INDEX idx_user_name ON employee(USER_NAME);
-- 查看索引
SELECT table_name, index_name, index_type from user_indexes WHERE index_name='idx_user_name';
-- 删除索引
DROP INDEX idx_user_name;
补充扩展
1. 常用索引类型创建
-- 联合索引(多字段组合,适合联合查询)
CREATE INDEX idx_user_code_name ON "user"("user_code","user_name");
-- 唯一索引(字段值唯一,避免重复,比普通索引查询更快)
CREATE UNIQUE INDEX idx_unique_user_code ON "user"("user_code");
-- 主键索引(主键默认自动创建,手动指定主键时显式创建)
ALTER TABLE "user" ADD PRIMARY KEY ("id");
2. 索引高级查询
-- 查看指定表的所有索引及字段
SELECT t.table_name, t.index_name, t.index_type, c.column_name
FROM user_indexes t
JOIN user_ind_columns c ON t.index_name = c.index_name
WHERE t.table_name = 'USER';
-- 查看无效索引(需重建,提升查询效率)
SELECT index_name, table_name FROM user_indexes WHERE status = 'INVALID';
3. 索引操作注意事项
- 索引提升查询速度,但会降低插入/更新/删除速度,避免对频繁更新的字段建索引;
- 单表索引数量不宜过多(建议不超过10个),避免增加数据库维护成本;
- 删除索引时,需确认无查询语句依赖该索引。
七、表字段查看
基础语句
-- 查看字段基本信息(类型、长度、是否为空等)
select * from all_tab_columns where owner='TEST' and Table_Name='USER';
-- 查看字段注释
select * from dba_col_comments where owner='TEST' and Table_Name='USER';
补充扩展
1. 简化查询(当前用户)
-- 查看当前用户表字段信息
select * from user_tab_columns where Table_Name='USER';
-- 查看当前用户表字段注释
select * from user_col_comments where Table_Name='USER';
2. 联合查询(字段信息+注释)
一次性查看字段的类型、长度、非空约束、注释,无需分开查询,语句:
select
c.column_name 字段名,
c.data_type 字段类型,
c.data_length 长度,
case when c.nullable = 'Y' then '是' else '否' end 可为空,
nvl(cc.comments, '无') 字段注释
from all_tab_columns c
left join dba_col_comments cc on c.owner=cc.owner and c.table_name=cc.table_name and c.column_name=cc.column_name
where c.owner='TEST' and c.table_name='USER'
order by c.column_id; -- 按字段创建顺序排序
八、新增核心日常运维操作
8.1 数据库实例/授权信息查询
用于确认数据库版本、授权有效期、字符集等基础信息,是运维的基础操作。
-- 1. 查询数据库授权信息(有效期、CPU授权、用户数等)
SELECT
LIC_VERSION AS "许可证版本",
SERIES_NO AS "序列号",
TO_CHAR(EXPIRED_DATE) AS "授权有效日期",
PRODUCT_TYPE AS "产品名称",
MAX_CPU_NUM AS "授权CPU个数"
FROM V$LICENSE;
-- 2. 查询数据库实例核心参数
SELECT
'数据库版本' AS "参数名", (SELECT id_code FROM v$instance) AS "参数值" UNION ALL
'数据库名' AS "参数名", name FROM v$database UNION ALL
'是否启用归档' AS "参数名", case arch_mode when 'Y' then '是' when 'N' then '否' end FROM v$database UNION ALL
'字符集' AS "参数名", CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' end FROM dual UNION ALL
'启动时间' AS "参数名", to_char(last_startup_time) FROM v$database;
8.2 表空间管理
表空间是达梦数据库的核心逻辑存储单元,日常需监控其使用情况,避免空间不足。
-- 1. 查看所有表空间状态(联机/脱机、总大小)
SELECT
NAME AS "表空间名",
CASE TYPE$ WHEN '1' THEN '业务表空间' WHEN '2' THEN '临时表空间' END AS "类型",
CASE STATUS$ WHEN '0' THEN '联机' WHEN '1' THEN '脱机' END AS "状态",
TOTAL_SIZE*PAGE/1024/1024 AS "总大小(MB)"
FROM V$TABLESPACE;
-- 2. 查看表空间使用情况(已用/剩余/使用率)
SELECT
F.TABLESPACE_NAME AS "表空间名",
ROUND((T.TOTAL_SPACE - F.FREE_SPACE) / 1024, 2) AS "已用(MB)",
ROUND(F.FREE_SPACE / 1024, 2) AS "剩余(MB)",
ROUND((T.TOTAL_SPACE - F.FREE_SPACE)/T.TOTAL_SPACE*100, 2) AS "使用率(%)"
FROM DBA_TABLESPACE_USAGE F
JOIN (SELECT TABLESPACE_NAME, SUM(TOTAL_SPACE) AS TOTAL_SPACE FROM DBA_TABLESPACE_USAGE GROUP BY TABLESPACE_NAME) T
ON F.TABLESPACE_NAME = T.TABLESPACE_NAME;
-- 3. 创建表空间
CREATE TABLESPACE MY_TBS
DATAFILE '/dm8/data/DAMENG/MY_TBS.DBF'
SIZE 10240 MB; -- 初始大小10G
-- 4. 表空间扩容(添加新数据文件)
ALTER TABLESPACE MY_TBS
ADD DATAFILE '/dm8/data/DAMENG/MY_TBS_02.DBF'
SIZE 5120 MB; -- 新增5G数据文件
8.3 数据库表数据操作
补充日常高频的增、删、改、查基础语句,适配业务操作需求。
-- 1. 插入数据(单条/批量)
INSERT INTO "user" ("id","user_code","user_name","is_del") VALUES (1,'U001','张三','0');
INSERT INTO "user" ("id","user_code","user_name","is_del")
VALUES (2,'U002','李四','0'),(3,'U003','王五','0');
-- 2. 更新数据(带条件,避免全表更新)
UPDATE "user" SET "user_name"='张三丰', "update_time"=SYSDATE WHERE "id"=1;
-- 3. 删除数据(逻辑删除优先,避免物理删除)
-- 物理删除(慎用,数据不可恢复)
DELETE FROM "user" WHERE "id"=3;
-- 逻辑删除(推荐,通过删除标志标记)
UPDATE "user" SET "is_del"='1' WHERE "id"=3;
-- 4. 分页查询(达梦专用LIMIT,兼容MySQL)
SELECT * FROM "user" WHERE "is_del"='0' ORDER BY "create_time" DESC LIMIT 10 OFFSET 0; -- 第一页,10条/页
8.4 权限基础操作
达梦数据库采用三权分立架构(SYSDBA/SYSSSO/SYSAUDITOR),日常需为普通用户分配基础权限。
-- 1. 创建普通用户
CREATE USER TEST_USER IDENTIFIED BY "Test@123456"; -- 密码需符合复杂度要求
-- 2. 授予用户表操作权限(查询/插入/更新/删除)
GRANT SELECT,INSERT,UPDATE,DELETE ON TEST."user" TO TEST_USER;
-- 3. 授予用户创建表/视图权限
GRANT CREATE TABLE,CREATE VIEW TO TEST_USER;
-- 4. 回收权限
REVOKE DELETE ON TEST."user" FROM TEST_USER;
九、通用操作注意事项
- 大小写敏感:达梦数据库默认开启大小写敏感,创建对象时若加双引号,则按原大小写匹配,否则默认大写;
- 事务控制:执行
alter table、drop index、delete等操作时,建议开启事务,执行失败可回滚,语句:
BEGIN; -- 开启事务
ALTER TABLE "user" ADD column("phone" VARCHAR(20));
COMMIT; -- 提交事务
-- ROLLBACK; -- 执行失败则回滚
- 操作前备份:对核心表执行结构修改(如修改字段类型、删除字段)、数据删除前,需先备份表数据,避免数据丢失;
- 生产环境规范:生产环境禁止直接执行
drop、truncate等高危语句,建议通过只读账号查询,运维账号执行修改操作,并做好操作记录。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)