达梦数据库的常用操作

达梦数据库(DM)作为国产关系型数据库的代表,其日常操作围绕表、字段、索引等基础对象展开,同时结合表空间管理、数据库状态查询、权限管理等核心运维能力,形成完整的操作体系。本文在原有基础操作的基础上,补充操作说明、扩展用法、运维查询、表空间管理等内容,让操作更具实用性和完整性。

一、检查数据库表是否存在

基础语句

select * from all_Objects where owner ='TEST' and object_type='TABLE' and Object_name like '%HC%';

补充说明

  1. owner:表的所属用户,需大写(达梦默认对象名大小写敏感,若创建时加双引号则按原大小写匹配);
  2. object_type:除TABLE外,还可查询VIEW(视图)、INDEX(索引)、PROCEDURE(存储过程)等对象;
  3. 精准查询:取消模糊查询可直接匹配表名,语句:
select * from all_Objects where owner ='TEST' and object_type='TABLE' and Object_name ='HC_TABLE';
  1. 当前用户表查询:若查询登录用户下的表,可简化为select * from user_tables where table_name like '%HC%';,无需指定owner

二、查看建表语句

基础语句

select DBMS_METADATA.GET_DDL('TABLE','数据库表') from dual;

补充扩展

  1. 指定所属用户:查询其他用户的表建表语句,需在表名后拼接用户,语句:
select DBMS_METADATA.GET_DDL('TABLE','USER','TEST') from dual;
  1. 格式化输出:默认输出可能存在换行混乱,可通过设置参数格式化,语句:
SET LINESIZE 200;  -- 设置行宽
SET PAGESIZE 0;   -- 取消分页
select DBMS_METADATA.GET_DDL('TABLE','USER','TEST') from dual;
  1. 查看视图/索引建语句:替换TABLEVIEW/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否';

补充说明

  1. 批量新增字段:无需多次执行alter table,可一次性新增多个字段,语句:
alter table "user" add (
    "is_del" CHAR(1) comment '删除标志,1是0否',
    "create_time" DATETIME comment '创建时间',
    "update_time" DATETIME comment '更新时间'
);
  1. 设置字段默认值:新增字段时可直接指定默认值,避免后续更新,语句:
alter table "user" add column("is_del" CHAR(1) default '0');
comment on column "user" ."is_del" is '删除标志,1是0否,默认0未删除';
  1. 非空约束:新增必填字段时添加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";

注意事项

  1. 重命名前需确认无业务程序正在使用该字段,避免程序报错;
  2. 若字段存在索引、触发器、存储过程依赖,重命名后需同步修改依赖对象;
  3. 达梦数据库中,若表名/字段名未加双引号,默认大写,重命名时需保持一致,例如:
-- 无引号创建的表,重命名语句
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;

九、通用操作注意事项

  1. 大小写敏感:达梦数据库默认开启大小写敏感,创建对象时若加双引号,则按原大小写匹配,否则默认大写;
  2. 事务控制:执行alter tabledrop indexdelete等操作时,建议开启事务,执行失败可回滚,语句:
BEGIN;  -- 开启事务
ALTER TABLE "user" ADD column("phone" VARCHAR(20));
COMMIT;  -- 提交事务
-- ROLLBACK;  -- 执行失败则回滚
  1. 操作前备份:对核心表执行结构修改(如修改字段类型、删除字段)、数据删除前,需先备份表数据,避免数据丢失;
  2. 生产环境规范:生产环境禁止直接执行droptruncate等高危语句,建议通过只读账号查询,运维账号执行修改操作,并做好操作记录。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐