【达梦数据库】数据更新、DM索引(超详细)

news2025/1/15 17:14:24

文章目录

  • 一、数据更新
    • 1)插入数据(insert into)
      • 1. 值插入(insert into ... values...)
      • 2. 查询插入(insert into...select...)
    • 2)修改数据(update...set...)
    • 3)删除数据(delete from...)
    • 4)另:merge into语句
  • 二、DM索引
    • 1)创建索引(create index...on)
        • 说明:
        • 何时使用索引?
      • 几种常见的索引
        • 1. 在单个字段上建立普通索引
        • 2. 在多个字段上建立唯一索引(unique)
        • 3. 在单个字段上建立函数索引
        • 4. 在低基数字段上建立位图索引
    • 2)修改索引(alter index...)
    • 3)删除索引 (drop index...)

一、数据更新

在这里插入图片描述

1)插入数据(insert into)

数据插入语句insert用于往已定义好的表中插入单个或成批的数据。

insert语句有2种形式:

  • 值插入:构造一行或者多行,并将它们插入到表中

  • 查询插入:通过返回一个查询结果集以构造要插入表的一行或多行。

1. 值插入(insert into … values…)

构造一行或者多行,并将它们插入到表中

insert into <表名>[(<列名>{<列名>})]
values (<插入值>{,<插入值>};  // 一个值
|<插入值>{,<插入值>}){(,<插入值>{,<插入值>})}; // 多个值

说明:

<列名> 指明表或视图的列的名称。在插入的记录中,这个列表中的每一列都被values子句赋一个值。

  • 如果在此列表中省略了表的一个列名,则达梦用先前定义好的默认值插入到这一列中。

  • 如果此列表被省略,则在values子句中必须为表中的所有列指定值。

<插入值> 指明在列表中对应的列的插入的列值,如果列表被省略了,插入的列值按照基表中列的定义顺序排列。

举例:

  1. 在EMPLOYEE中插入一条记录。
set schema dmhr;  // 设置当前模式,以下的语句都在这个模式下执行

insert into employee(employee_id, employee_name, email, phone_num, hire_date, job_id, department_id)
values(12002, '张三', 'maxuebing@dameng.com', '15312348552', '1981-02-20', 52,1105);
  1. 在EMPLOYEE中插入多行记录。
set schema dmhr;  // 设置当前模式,以下的语句都在这个模式下执行

insert into employee(employee_id, employee_name, email, phone_num, hire_date, job_id, department_id)
values(12002, '张三', 'maxuebing@dameng.com', '15312348552', '1969-02-20', 52,1105),
(12004,'李四', 'liwu@dameng.com', '15312348554','1972-02-20',53, 1001);

2. 查询插入(insert into…select…)

将查询结果集插入指定数据表。

insert into <表名>[(<列名>{<列名>})]
select <列名> {,<列名>} from 源数据表名[where条件]

例:使用select子句将employee中部门为“市场部”的人员信息存储到一个新表em-ployee_sale中。

create table em-ployee_sale 
as
select employee_id, employee_name, email, hire_date, job_id from employee where false;


insert into em-ployee_sale
(employee_id, employee_name, email, hire_date, job_id)
select t.employee_id, t.employee_name, email, hire_date, job_id
from employee t, department n
where t.department_id = n.department_id and n.department_name='市场部';

2)修改数据(update…set…)

update <表名>|<视图名>
set <列名> = <值表达式> | default>
    {,<列名>=<值表达式> | default>}
[where<条件表达式>];

<表名>:指明被修改数据的表的名称。
<视图名>:指明被修改数据的视图的名称,实际上是对视图的基表更新数据。
<列名>:表或视图中被更新列的名称,如果set子句中省略列的名称,列的值保持不变。
<值表达式>:指明赋予相应列的新值。
<条件表达式>:指明限制被更新的行必须符合指定的条件,如果省略此子句,则修改表或视图中所有的行。

举例:

  1. 将EMPLOYEE中所有人员的工资增加补助500元。
update employee set salary=salary+500;
  1. 将employee中市场部人员的工资在市场部员工平均工资的基础上增加10%
update employee set salary=salary +
(select avg(salary)*0.1 from employee t, department n where t.department_id=n.department_id and n.department_name='市场部')
where department_id in (select department_id from department where department_name='市场部');
  1. (同时修改多个字段数据) 将job表中测试工程师的最低工资标准和最高工资标准提高5%。
update job set min_salary=min_salary*1.05, max_salary=max_salary*1.05
where job_title='测试工程师';

3)删除数据(delete from…)

delete from <表名> [where <条件表达式>]

<表名>: 指明被删除数据的表名称。
<条件表达式>: 指明限制被更新的行必须符合指定的条件,如果省略此子句,则修改表或视图中所有的行。

举例:

  1. 删除表job中的所有数据。
delete from job;

select * from job; // 查看job表是否删除
  1. 删除job_history表中市场专员人员的工作历史记录。
delete from job_history
where job_id=(select job_id from job where job_title='市场专员');

在这里插入图片描述

4)另:merge into语句

使用merge into语句可合并update和insert语句。

通过MERGE语句,根据一张表(或视图)的连接条件对另外一张表(或视图)进行查询,连接条件匹配上的进行update(可能含有delete),无法匹配的执行insert。其中,数据表包括普通表、分区表、加密表、压缩表和list表。

merge into <目标表引用>[<表别名>] using <from 源表引用> on (<目标表和源表的连接条件判断表达式>)
<[<merge_update_clause>] | [<merge_insert_clause>]>
  • on(<条件判断表达式>) : 表示目标表和源表的连接条件,如果目标表有匹配连接条件的记录则执行更新该记录,如果没有匹配到则执行插入源表数据。

  • merge_insert_clause: 当目标表和源表的JOIN条件为false时,执行该语句。同时会触发目标表上的insert触发器,也会进行约束检查。可指定插入条件,插入条件只能在源表上设置。

  • merge_update_clause和merge_insert_clause既可以同时指定,也可以只出现其中任何一个。

  • 需要有对源表的select权限,对目标表的UPDATE/INSERT权限,如果UPDATE子句有DELETE,还需要有delete权限。

  • update子句不能更新在ON连接条件中出现的列。

  • 如果匹配到,源表中的匹配行必须唯一,否则报错。

  • insert_action不能包含目标表列。

  • 插入的where条件只能包含源表列。

举例:

  1. 把表T1中C1值为2的记录行中的C2列更新为表T2中C3值的记录中C4列的值,同时把表T2中C3列为4的记录行插入到了表T1中。
create table t1(c1 int, c2 varchar(20));
create table t2(c3 int, c4 varchar(20));

insert into t1 values(1,'T1_1');
insert into t1 values(2,'T1_2');
insert into t1 values(3,'T1_3');

insert into t2 values(2,'T2_2');
insert into t2 values(4,'T2_4');


merge into t1 using T2 on(t1.c1=t2.c3)
when matched then update set t1.c2=t2.c4
when not matched then insert(c1,c2) values(t2.c3,t2.c4);
  1. 把表T1中C1值为2,4的记录行中的C2列更新为表T2中C3值的记录中C4列的值,同时把表T2中C3列为5的记录行插入到了表T1中。由于update带了delete子句,且表T1中C1列值为2和4的记录行被更新过,而C1为4的行符合删除条件,最终该行会被删除掉。
create table t1(c1 int, C2 varchar(20));
create table t2(c3 int, C4 varchar(20));

insert into T1 values(1,'T1_1');
insert into T1 values(2,'T1_2');
insert into t1 values(3,'T1_3');
insert into t1 values(4,'T1_4');

insert into t2 values(2,'T2_2');
insert into t2 values(4,'T2_4');
insert into t2 values(5,'T2_5');


merge into t1 using t2 on(t1.c1=t2.c3)
when matched then update set t1.c2=t2.c4 where t1.c1>2
    delete where t1.c1=4
when not matched then insert(c1,c2) values(t2.c3,t2.c4);

在这里插入图片描述

二、DM索引

在这里插入图片描述

1)创建索引(create index…on)

说明:
  1. 索引是与表相关的一种结构,能更快地定位数据,使对应于表的SQL语句执行得更快。

  2. 索引需要存储空间。

  3. 创建或删除一个索引,不会影响基本表、数据库应用或其他索引。

  4. 当插入、更改和删除相关的表的行时,DM会自动管理索引。

  5. 索引可以提高数据的查询效率,但也需要注意索引会降低某些命令的执行效率,如insert、update、delete的性能,因为DM不仅要维护基表数据还要维护索引数据。

何时使用索引?
  1. 如果需要经常性地检索大表中的少量的行,就为查询键创建索引

  2. 为了改善多个表的连接的性能,可为连接列创建索引

  3. 主键和唯一键自动具有索引,在外键上很多情况下也创建索引

  4. 小表不需要索引

几种常见的索引

在这里插入图片描述

create [or replace][cluster|not partial][unique|bitmap | spatial]
index <索引名> on [<模式名>.]<表名>(<索引列定义>{,<索引列定义>})
[global][<storage子句>][nosort][online];

说明︰

  1. on关键字:表示在哪个表的哪个字段上建立索引,字段的类型不能是多媒体类型。

  2. <索引名>:指明被创建索引的名称,索引名称最大长度128字节;

  3. 在字段后面指定索引排序方式,ASC表示递增排序,DESC表示递减排序,默认为递增排序。

  4. storage关键字:设置索引存储的表空间,默认与对应表的表空间相同。

  5. unique:指明该索引为唯一索引;

  6. bitmap:指明该索引为位图索引;

  7. spatial:指明该索引为空间索引;

  8. not partial:指明该索引为非聚簇索引,缺省即为非聚簇索引;

  9. 缺省索引类型参数则默认创建普通索引

1. 在单个字段上建立普通索引

例:以SYSDBA用户给purchasing模式的VENDOR表的vendorid字段建立普通索引,索引名为S1。

create index s1 on purchasing.vendor(vendorid);
2. 在多个字段上建立唯一索引(unique)

例:以SYSDBA用户给purchasing模式的vendor表的accountno和name字段建立唯一索引,索引名为S2。

create unique index s2 on purchasing.vendor(accountno, name)
3. 在单个字段上建立函数索引

例:以SYSDBA用户给dmhr模式下的city表的city_id字段建立lower()函数索引,索引名为city_lower。

create index city_lower on dmhr.city(lower(city_id));

select * from dmhr.city where lower(city_id)='wh';  // 利用函数索引查看数据
4. 在低基数字段上建立位图索引

低基数字段:字段取值比较少的字段。

关于索引的说明:

  1. 位图连接索引名称的长度限制为事实表名的长度+索引名称长度+6 <128

  2. 仅支持普通表、LIST表和HFS表。

  3. where条件只能是列与列之间的等值连接,并且必须含有所有表。

  4. 位图连接索引表(命名为BMJ$_索引名)仅支持select操作,不支持insert、delete、update、alter、drop等操作。

例:以SYSDBA用户给dmhr模式下的employee表的job_id字段建立位图索引。

create bitmap index dmhr.empjob_idx on dmhr.employee(job_id);

// 利用位图索引查询数据
select employee_id, employee from dmhr.employee where job_id=21;  

在这里插入图片描述

2)修改索引(alter index…)

alter index [<模式名>.]<索引名><修改索引定义子句>
<修改索引定义子句>::=
rename to[<模式名>.]<索引名>|<invisible|visible>
<unusable>
|<rebuild>[nosort][online]
|<monitoring|nomonitoring>usage;

说明:

  1. <模式名>:重命名索引

  2. invisible:查询语句的执行不使用该索引,该索引相关计划不会生成,用别的计划代替。

  3. visible(默认):会生成索引相关的计划。

  4. unusable:索引将被置为无效状态,系统将不再维护此索引。

  5. rebuild:重建索引,将置索引的状态为生效状态。

  6. nosort:重建时不需要排序。

  7. online:重建时使用异步创建逻辑,在过程中可以对索引依赖的表做增删改操作。

  8. monitoring usage:对指定索引进行监控。

  9. nomonitoring usage:对指定索引取消监控。

例1:以SYSDBA用户重命名S1索引为S3。

alter index purchasing.S1 rename to purchasing.S3;

例2:VISIBLE与INVISIBLE举例。

set schema dmhr;


create table test("C1" int, "C2" int);
create index index_c1 on test(c1);

alter index index_c1 invisible;

在这里插入图片描述

例3:使用unusable将索引置为无效状态。

create table test("C1" int, "C2"int);
create index index_C1O on test(C1);

alter index index_C1 unusable; // 此时系统将不维护index_c1,与此相关的计划均失效。

注意,若索引是用于保证数据唯一性的,那么此时表仅能查询,不能更新。

例4:使用rebuild将索引置为生效状态。

alter index index_c1 rebuild;

3)删除索引 (drop index…)

drop index [if exists][<模式名>.]<索引名>;

说明︰

  1. 删除索引的用户应拥有DBA权限或是该索引所属基表的拥有者。

  2. 索引是数据表的外在部分,删除索引不会删除表的任何数据,也不改变表的使用方式,只是会影响表数据的查询速度。

  3. 删除不存在的索引会报错。若指定if exists关键字,删除不存在的索引,不会报错。

举例:具有DBA权限的用户删除purchasing模式下的S1索引。

drop index purchasing.s1;

select vendorid, name from purchasing.vendor where vendorid>10;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1149276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法leetcode|86. 分隔链表(rust重拳出击)

文章目录 86. 分隔链表&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 86. 分隔链表&#xff1a; 给你一个链表的头节点 head 和一个特…

智能工厂解决方案

智能工厂解决方案&#xff1a;生产工单 智能工厂解决方案&#xff1a;物流中转 样品单-4.2寸 工单任务卡-4.2寸 工单流转卡-4.2寸 生产配送卡-4.2寸 工序参数卡-7.5寸 生产拣配单-7.5寸 仓库24代-参数 接收路由器发送的数据信息并解析&#xff0c;做出相应的指示&#…

低压系统防雷保护综合应用方案

低压系统的防雷保护是指保护低压电源系统和电气设备免受雷击和电涌电压造成的损坏的技术措施。它包括直击雷保护、侵入波保护、等电位连接和防雷接地等方面。它在通信、光伏、电动汽车等行业都有广泛的应用。 地凯科技低压系统防雷保护是指保护低压电源系统和电气设备免受雷击…

idea断点模式下,获得对象的值(JSON格式)

打开IDEA里面自带的计算器使用json将你需要的对象输出到Result框

【C++入门篇】保姆级教程篇【中】

目录 零、面向对象的由来 一、结构体与类 二、类和对象 1&#xff09;面向过程和面向对象&#xff1a; 2&#xff09;类的声明与定义 3&#xff09;类的访问限定符 三、this指针 1&#xff09;this指针的概念 2&#xff09;this指针的特性 四、类的默认成员函数 1&#xff…

一文详解汽车电子LIN总线

0.摘要 汽车电子LIN总线不同于CAN总线。 LIN总线基本上是CAN总线的廉价补充&#xff0c;相比于CAN总线&#xff0c;它提供较低的可靠性和性能。同时LIN总线也是一个应用非常广泛的网络协议&#xff0c;并且越来越受欢迎。 再一次&#xff0c;我们准备了一个关于LIN总线的简要…

Mybatis—基础操作

mybatis入门后&#xff0c;继续学习mybatis基础操作。 目录 Mybatis基础操作准备工作删除操作日志输入预编译SQLSQL注入参数占位符 新增操作基本新增添加后返回主键 更新操作查询操作根据id查询数据封装条件查询条件查询 Mybatis基础操作 准备工作 根据下面页面原型及需求&am…

相邻节点迭代器

图论中最常见的操作就是遍历邻边&#xff0c;通过一个顶点遍历相关的邻边。邻接矩阵的遍历邻边的时间复杂度为 O(V)&#xff0c;邻接表可以直接找到&#xff0c;效率更高。 邻接矩阵迭代: ... public Iterable<Integer> adj(int v) {assert v > 0 && v < …

消息认证码--数字签名--证书

6. 消息认证码—>保证数据的完整性 "消息认证码 --- 消息被正确传送了吗?"6.1 什么是消息认证码 Alice 和 Bob 的故事 像以前一样&#xff0c;我们还是从一个Alice和Bob的故事开始讲起。不过&#xff0c;这一次Alice和Bob分别是两家银行&#xff0c;Alice银行通…

智慧公厕:提升城市卫生与舒适体验的未来之选

智慧公厕作为城市管理的一项重要创新&#xff0c;已经在环境监测调控、厕位监测引导、自动化清洁、自动灯光控制、远程控制等方面展现出先进而完善的功能。它不仅提升了市民对公共厕所卫生、舒适、安全等方面的使用体验&#xff0c;同时也为城市管理带来了颇具引领性的改革和升…

为什么MySQL没有负载,但交易却跑不动?

在MySQL的数据库中&#xff0c;我们有时会发现MySQL数据库明明没有负载&#xff0c;CPU、硬盘、内存和网络等资源都很空闲&#xff0c;但很多SQL都pending在哪儿&#xff0c;MySQL数据库无法处理交易。这是怎么回事呢&#xff1f; 在数据库系统中出现这种情况通常是锁竞争造成…

C#,数值计算——Globals的计算方法与源程序

1 文本格式 using System; using System.Text; namespace Legalsoft.Truffer { public static partial class Globals { //const int FLT_RADIX 2; //const int DBL_MANT_DIG 53; //const int INT_DIGITS 32; //const float FLT_…

精密空调监控方法,让你一次全学会!

随着科技的迅猛发展&#xff0c;越来越多的领域和行业对温度和湿度等环境参数的高度控制需求日益增长。无论在哪里&#xff0c;对精密空调的依赖都在不断增加。 然而&#xff0c;要确保这些系统的高效运行和监测已经变得愈发复杂。为了解决这些挑战&#xff0c;精密空调监控系统…

【java学习—十】TreeSet集合(5)

文章目录 1. TreeSet1.1. 自然排序1.2. 定制排序 1. TreeSet TreeSet 是 SortedSet 接口的实现类&#xff0c; TreeSet 可以确保集合元素处于排序状态。     TreeSet 支持两种排序方法&#xff1a;自然排序和定制排序。默认情况下&#xff0c; TreeSet 采用自然排序。 1.1.…

java项目之学校招生信息网(ssm)

项目简介 学校招生信息网实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、学生管理&#xff0c;党员风采管理&#xff0c;校园之家管理&#xff0c;师资队伍管理&#xff0c;院系简介管理&#xff0c;专业简介管理&#xff0c;录取信息管理、学生录取管理、系统管理…

【ChatGPT瀑布到水母】AI 在驱动软件研发的革新与实践

这里写目录标题 前言内容简介作者简介专家推荐读者对象目录直播预告 前言 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术&#xff0c;也在不…

Egg.js 中 Controller 的使用

如果需要了解Controller &#xff0c;就得知道什么是mvc。 MVC概述 什么是mvc&#xff0c;这个概念&#xff0c;我相信绝大部分人肯定是了解的。MVC是模型&#xff08;model&#xff09;- 视图&#xff08;view&#xff09;- 控制器&#xff08;controller&#xff09;的缩写…

git跳过用户名密码验证,以及配置credential-helper

平时我们在使用git命令时&#xff0c;如果使用http方式拉取代码每次都需要使用填写用户名和密码&#xff0c;非常的麻烦。 如何才能绕过每次繁琐的填充? 如果想要绕过git的交互方式&#xff0c;首先需要了解git的密码存储机制。 git使用的使用是一种名叫**[credential helpe…

ssm搭建后404的错误

spring、mybatis 的配置文件一般不会出错&#xff08;注解扫描路径要涵盖 controller层&#xff09;&#xff0c;controller 层 url 一般也不会写错&#xff0c;出现404&#xff0c;更容易忽略的是 文件路径位置。 首先是 idea 提示 servlet-mapping 找不到 , 我这里显然是有的…

Java-PriorityQueue 优先队列(结构与用法)

1. 数据结构 1.1 2.Java使用 2.1 核心要点 PriorityQueue是一个无限制的队列&#xff0c;并且动态增长。默认情况下&#xff0c;优先级队列的对象按自然顺序排序。PriorityQueue 不是线程安全的。多线程情况下可以使用PriorityBlockingQueue。 2.2 构造函数 PriorityQueu…