一、深入理解CASE_SENSITIVE参数的作用
场景一:初始化数据库实例为大小写敏感库
1.1 查看数据库大小写配置信息
值的含义:1为大小写敏感,0为大小写不敏感
注意:初始化一旦设定是不能更改了的
1.2 执行DML或DDL操作
- 如果不对表名或列名添加" ",那么表名和列名都自动转换为大写形式;
- 如果对表名或列名添加" “,会固定书写时的大、小写形式,书写时采取的是小写形式,那么就定型为小写形式,其他不添加” "的则自动转换为大写形式,无论书写时采取的是大写形式或小写形式。
- 同名的数据库对象,如果大小写不同,那么则为两个不同的对象,字段同样如此;
- 一个表中,允许存在同名且不同大小写形式的字段。
- DML或DDL操作不带双引号则默认是大写,指定字段小写需要加上双引号
场景二:初始化数据库实例为大小写不敏感库
1.1查看数据库大小写配置信息
SQL> select case_sensitive();
1.2 执行DML或DDL操作
- 无论对不对表名或列名添加" ",表名和列名的大小写形式不会发生变化,大写形式就是大写形式,小写形式就是小写形式;
- 不允许存在同名的数据库对象,即使大小写不同,默认也只能存在一个;
- 一个表中,也不允许相同的字段名,即使大小写不同;
- 查询时,’ '和" "界定符不区分大小写,界定符中的查询或过滤条件即使是大写或小写,都可以查询到预期的结果集。
二、深入理解LENGTH_IN_CHAR和CHARSET的影响情况
LENGTH_IN_CHAR:1代表以字符为单位进行存储,0代表以字节为单位进行存储 (默认以字节为单位进行存储)
CHARSET/UNICODE_FLAG:字符集选项。取值:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0。
通过这两个参数组合使用,具体存储方案如下所示:
注:以上两个参数初始化一旦设定不允许修改
三、disql的使用
DIsql 是 DM 数据库的一个命令行客户端工具,用来与 DM 数据库服务器进行交互,其存放在安装目录下的bin文件下,通过./disql username/password@ip:port的方式进行连接数据库(ip和端口不写默认是localhost和5236)
使用login命令或者conn命令进行远程数据库的连接
SQL> login
服务名:192.168.223.20
用户名:SYSDBA
SQL> conn SYSDBA/SYSDBA@192.168.223.20:5236
服务器[192.168.223.20:5236]:处于普通打开状态
登录使用时间 : 3.350(ms)
通过logout或者disconn命令退出远程登录
SQL> logout
SQL> disconn
使用set命令来设置和修改环境变量的值
使用show命令用来查看当前环境变量的值
使用spool命令将查询结果输出到指定文件
SQL> spool ‘/dm8/a.sql’
SQL> select * from student;
SQL> spool off
[root@localhost dm8]# cat a.sql
使用host命令可以切换到操作系统下来执行系统命令(不用退出disql)
SQL> host pwd
使用desc命令获取表或视图、存储过程、函数、包、记录、类的结构描述
SQL> desc student
使用start命令来执行sql脚本文件
四、模式
用户的模式(Schema)指的是用户账号拥有的对象集,在概念上可将其看作是包含表、视图、索引和权限定义的对象。在 DM 中,一个用户可以创建多个模式,一个模式中的对象(表、视图等)可以被多个用户使用。模式不是严格分离的,一个用户可以访问他所连接的数据库中有权限访问的任意模式中的对象
系统为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语句建立其它模式
采用模式的原因有几点:
允许多个用户使用一个数据库而不会干扰其它用户;
把数据库对象组织成逻辑组,让它们更便于管理;
第三方的应用可以放在不同的模式中,这样可以避免和其它对象的名字冲突。模式类似于操作系统层次的目录,只不过模式不能嵌套
4.1 创建模式并切换到当前模式后再删除该模式
create schema test authorization demo
create table t_test(
tid int);
insert into t_test values(666);
set schema test;
select * from t_test;
set schema demo;
drop schema test cascade;
五、数据类型
常规数据类型主要包括如下几大类
5.1 字符数据类型
根据数据库初始化时的参数不同,字符串中能存储的汉字的个数也不尽相同
UNICODE_FALG:此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。需要注意的是,数据库一旦初始化完成,字符集就将无法修改。我们可以使用 select unicode 来查询当前数据库的字符集种类,0 代表 gb18030;1 代表 UTF-8。
LENGTH_IN_CHAR:此参数决定了数据库中的 VARCHAR 类型对象的长度是否以字符为单位。0代表以字节为单位,1代表以字符为单位。
5.2 数值数据类型
精确数值数据类型包括:NUMERIC、DECIMAL、DEC 类型、NUMBER 类型、INTEGER 类型、INT 类型、BIGINT 类型、TINYINT 类型、BYTE 类型、SMALLINT 类型、BINARY 类型、VARBINARY 类型。
近似数值类型包括:FLOAT 类型、DOUBLE 类型、REAL 类型、DOUBLE PRECISION 类型
NUMERIC[(精度 [, 标度])]
NUMERIC 数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了总的数字数,精度范围是 1 至 38。标度定义了小数点右边的数字位数。一个数的标度不应大于其精度,如果实际标度大于指定标度,那么超出标度的位数将会四舍五入省去
create table t_numeric(
num numeric(4,1));
insert into t_numeric values(999.9);
insert into t_numeric values(-999.9);
select * from t_numeric;
插入的数据超出取值范围(取值范围-999.9-999.9)会报错
insert into t_numeric values(1000);
注:其它数值数据类型均可参照上述方式进行测试,这里就不一一演示啦
5.3 日期时间数据类型
一般日期时间数据类型
DATE 类型包括年、月、日信息;TIME 类型包括时、分、秒信息;TIMESTAMP 类型包括年、月、日、时、分、秒信息
时间间隔数据类型
DM 支持两类时间间隔类型:年-月间隔类和日-时间隔类,它们通过时间间隔限定符区分,前者结合了日期字段年和月,后者结合了时间字段日、时、分、秒。时间间隔数据类型所描述的值是有符号的
5.4 多媒体数据类型
多媒体数据类型的字值有两种格式:一是字符串,二是 BINARY(十六进制)
多媒体数据类型包括:
- TEXT/LONG/LONGVARCHAR 类型:变长字符串类型。其字符串的长度最大为 100G-1,用于存储长的文本串。
- IMAGE/LONGVARBINARY 类型:用于指明多媒体信息中的图像类型,长度最大为 100G-1 字节。
- BLOB 类型:用于指明变长的二进制大对象,长度最大为 100G-1 字节。
- CLOB 类型:用于指明变长的字母数字字符串,长度最大为 100G-1 字节。
- BFILE 类型:用于指明存储在操作系统中的二进制文件。
注:其中BLOB 和 IMAGE 类型的字段内容必须存储十六进制的数字串内容
六、表
6.1 创建表
6.1.1 创建基表
---------产品种类表---------------
create table product_class(
product_class_id int primary key,
product_class_name varchar(50) not null);
insert into product_class(product_class_name) values(‘Drinks’);
insert into product_class(product_class_name) values(‘Fruit’);
insert into product_class(product_class_name) values(‘Clothing’);
insert into product_class(product_class_name) values(‘Jewelry’);
---------产品存放表---------------
create table product_save(
product_save_id int primary key,
product_save_name varchar(50));
insert into product_save(product_save_name) values(‘Normal’)
insert into product_save(product_save_name) values(‘Special’);
insert into product_save(product_save_name) values(‘Important’);
insert into product_save(product_save_name) values(‘Danger’);
---------产品信息表----------------
create table product(
product_id int primary key,
product_name varchar(20) not null,
product_class_id int not null foreign key references product_class(product_class_id),
product_save_id int not null foreign key references product_save(product_save_id),
product_price double not null);
---------插入测试数据----------------
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘cola’,1,1,2.5);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘beer’,1,2,5.5);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘nike’,3,1,299);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘adidas’,3,1,199);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘gold’,4,3,10000);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘durian’,2,4,99);
insert into product(product_name,product_class_id,product_save_id,product_price)
values(‘apple’,2,1,4);
select * from product;
6.1.2 创建外部表
创建外部数据文件:
[root@localhost ext]# cat ext.txt
创建数据控制文件:
[root@localhost ext]# cat ext.ctl
创建外部表时需要先创建目录,再指定控制文件的名称(直接写控制文件路径是不可以的)
注意:from ‘/dm8/extdir/ext.ctl’会报错
正确的写法如下:
create directory extdir as ‘/dm8/ext’;
create external table ext(
r1 int,
r2 int,
r3 int)
from default directory extdir location(‘ext.ctl’);
select * from ext;
6.2 查看表(结构和信息)
查看表结构
call sp_tabledef(‘DEMO’,‘PRODUCT’);
查看表信息(根据具体需要来查询,此处省略)
6.3 修改表
6.4 删除表
6.4.1 删除数据
使用delete语句在student表中删除名称是liming的所有记录
delete from student where name=‘liming’;
select * from stu;
使用turncate语句删除所有表记录
select * from users;
truncate table users;
6.4.2 删除数据和表结构(即清理存储空间)
使用drop语句删除表数据和结构释放存储空间
drop table users;
select * from users;
七、索引
7.1 索引定义
索引是为了快速检索和定位数据行而创建的一种数据结构
创建索引的语法格式:
CREATE [OR REPLACE] [CLUSTER|NOT PARTIAL][UNIQUE | BITMAP| SPATIAL] INDEX [IF NOT EXISTS] <索引名>
ON [<模式名>.]<表名>(<索引列定义>{,<索引列定义>}) [GLOBAL][<PARTITION子句>][<表空间子句>][<STORAGE子句>] [NOSORT] [ONLINE] [REVERSE] [UNUSABLE] [<PARALLEL项>];
<索引列定义>::= <索引列表达式>[ASC|DESC]
<表空间子句>::= TABLESPACE <表空间名>
<STORAGE子句>::=<STORAGE子句1>|<STORAGE子句2>
<STORAGE子句1>::= STORAGE(<STORAGE1项> {,<STORAGE1项>})
<STORAGE1项> ::=
[INITIAL <初始簇数目>] |
[NEXT <下次分配簇数目>] |
[MINEXTENTS <最小保留簇数目>] |
[ON <表空间名>] |
[FILLFACTOR <填充比例>]|
[BRANCH <BRANCH数>]|
[BRANCH (<BRANCH数>, <NOBRANCH数>)]|
[NOBRANCH ]|
[CLUSTERBTR]|
[SECTION (<区数>)]|
[STAT NONE]
<STORAGE子句2>::= STORAGE(<STORAGE2项> {,<STORAGE2项>})
<STORAGE2项> ::= [ON <表空间名>]|[STAT NONE]
<PARALLEL项> ::=
NOPARALLEL |
PARALLEL [<并行数>]
<PARTITION子句> ::=请参考3.5.1.4 定义水平分区表
7.2 索引分类
常见的索引分类:
- 聚集索引(又称为一级索引、主索引):聚集索引就是按照聚集索引键构造一棵 B+ 树,表数据存储在 B+ 树叶子节点上,通过定位索引可直接在 B+ 树中找到数据。每一个表有且只有一个聚集索引
- 唯一索引:索引数据根据索引键唯一;唯一索引可以保证表上不会有两行数据在键列上具有相同的值,非唯一索引不会在键列上施加这个限制。
- 函数索引:基于函数的索引促进了限定函数或表达式的返回值的查询,该函数或表达式的值被预先计算出来并存储在索引中
- 位图索引:对低基数的列创建位图索引;位图索引主要针对含有大量相同值的列而创建。位图索引被广泛引用到数据仓库中,创建方式和普通索引一致,对低基数(不同的值很少)的列创建位图索引,能够有效提高基于该列的查询效率。且执行查询语句的 where 子句中带有 AND 和 OR 谓词时,效率更加明显
- 全文索引:在表的文本列上而建的索引
7.3 索引管理
创建聚集索引
create cluster index clu_emp_sex on emp(sex);
explain select * from emp where sex=‘woman’;
创建唯一索引
create unique index uni_emp_name on emp(name);
explain select * from emp where name=‘zhangsan’;
创建位图索引(位图索引与聚集索引不能构建在同一表上)
create bitmap index btm_emp_address on emp(address);
explain select * from emp where address=‘wuhan’;
删除索引
drop index index_name;
八、触发器
8.1 触发器定义
触发器(TRIGGER)定义当某些与数据库有关的事件发生时,数据库应该采取的操作。
只有具有创建触发器权限的用户或dba用户可以创建触发器,所以要想使用触发器必须具有创建触发器的权限(可以通过dba用户授予),执行触发器不需要授权,由系统自动触发执行
触发器通常用来自动完成数据库的维护工作:
1、可以对表自动进行复杂的安全性、完整性检查;
2、可以在对表进行 DML 操作之前或者之后进行其它处理;
3、进行审计,可以对表上的操作进行跟踪;
4、实现不同节点间数据库的同步更新。
创建触发器的语法格式:
CREATE [OR REPLACE] TRIGGER 触发器名[WITH ENCRYPTION]
BEFORE|AFTER|INSTEAD OF
DELETE|INSERT|UPDATE [OF 列名]
ON 表名
[FOR EACH ROW [WHEN 条件]]
BEGIN
DMSQL程序语句
END;
复杂语法格式说明:
OR REPLACE----如果存在同名触发器,则删除重新创建
WITH ENCRYPTION----对触发器进行加密,其他人看不到触发器定义代码
BEFORE|AFTER|INSTEAD OF----触发器执行时机,其中INSTEAD OF表示执行将
替换原始操作
DELETE|INSERT|UPDATE----选择需要执行的DML操作其中OF可以指定列名
FOR EACH ROW----指明该触发器是元组级触发器(即行级)默认为表级
8.2 触发器分类
触发器可以分为以下三类:
8.2.1 表级触发器
表级触发器都是基于表中数据的触发器,它通过针对相应表对象的插入/删除/修改等 DML 语句触发
创建测试数据:
–学生表 student
create table demo.student(
ID INT,NAME VARCHAR(10),
PHONE VARCHAR(11),
CREATE_TIME DATETIME DEFAULT SYSDATE);
–用户表 users
create table demo.users(
ID INT,NAME VARCHAR(10),
CREATE_TIME DATETIME DEFAULT SYSDATE);
创建 AFTER 触发器,该触发器在插入一条记录后,将该记录中ID、NAME的值插入到表USERS
create or replace trigger demo.tri_stu_after
after insert on demo.student
for each row
begin
insert into demo.users(id,name) values(:NEW.id,:NEW.name);
end;
insert into student values(1,‘zhangsan’,‘15930485760’,sysdate);
补充::NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。
创建 BEFORE 触发器,该触发器在插入一条记录前,将记录中ID的值加 1
create or replace trigger demo.tri_stu_before
before insert on demo.student
for each row
begin
:NEW.id:=:NEW.id+1;
end;
insert into demo.student values(2,‘lisi’,‘17436785670’,sysdate);
select * from student;
创建 INSTEAD OF 触发器,该触发器在动作触发的时候,替换原始操作,INSTEAD OF 允许建立在视图上,并且只支持行级触发
触发器创建之前的视图信息
create view v_stu as select * from demo.student;
select * from demo.v_stu;
触发器创建之后并执行后的视图信息
create or replace trigger ins_of_v_stu
instead of update on demo.v_stu
begin
insert into demo.student values(666,‘dameng’,‘15623406834’,sysdate);
end;
update demo.v_stu set id=2 where id=3;
select * from demo.v_stu;
8.2.2 时间触发器
时间触发器属于一种特殊的事件触发器,可以定义一些有规律性执行的、定点执行的任务。
创建时间触发器,在屏幕上每隔一分钟输出一行 hello dameng
create or replace trigger demo.tri_time
after timer on database
for each 1 day for each 1 minute
begin
print ‘hello dameng’;
end;
8.3 触发器管理
每个触发器创建成功后都自动处于允许状态 (ENABLE),当不想被触发,但是又不想删除这个触发器。这时,可将其设置关闭触发器 (DISABLE)
8.3.1 开关触发器
alter trigger demo.tri_stu_before disable;
alter trigger demo.tri_stu_before enable;
8.3.2 查看触发器
- select * from user_triggers;----查看当前用户所拥有的触发器
- select * from all_triggers;----查看当前用户有权访问的触发器
- select * from dba_triggers;----查看当前数据库全部触发器
8.3.3 删除触发器
drop trigger demo.ins_of_v_stu;
九、视图
9.1 视图定义
视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,它简化了用户数据模型,提供了逻辑数据独立性,实现了数据共享和数据的安全保密
创建视图的语法格式:
CREATE [OR REPLACE] VIEW [<模式名>.]<视图名>[(<列名> {,<列名>})] AS <查询说明> [WITH [LOCAL|CASCADED]CHECK OPTION]|[WITH READ ONLY];
<查询说明>::=<表查询> | <表连接>
<表查询>::=<子查询表达式>[ORDER BY子句]
作用:物化视图可以用于数据复制(Data Replication),也可用于数据仓库缓存结果集以此来提升复杂查询的性能
9.2 视图分类
9.2.1 简单视图
视图可以通俗的理解为用户通过定义自己所特定需求而提前写好的sql语句,视图中的数据来自基表(查询语句所查询的一张表或多张表),基表数据改变视图数据也跟着改变
9.2.2 复杂视图
由两张或两张以上的表导出时可以称作是复杂视图,复杂视图不允许直接 DML,也就是说复杂视图不允许更新
9.2.3 物化视图
数据要单独存储,占用磁盘空间,规划表空间。物化视图的数据来自于基表,基表发生的变化,物化视图可以根据更新方式来进行数据更新,更新方式可分为手动(默认)和自动,自动又分成快速(fast)、完全(complete)、选择(force)、不更新(never)
创建物化视图的语法格式:
CREATE MATERIALIZED VIEW [<模式名>.]<物化视图名>[(<列名>{,<列名>})][<辅助表子句>|<预建表子句>][<物化视图刷新选项>][<查询改写选项>]AS<查询说明>
<辅助表子句>::= [BUILD IMMEDIATE|BUILD DEFERRED][<表空间子句>][<STORAGE子句>]
<表空间子句>::= 参见3.5.1.1 定义数据库基表
<STORAGE子句>::= 参见3.5.1.1 定义数据库基表
<预建表子句>::= FOR <预建表表名> ON PREBUILT TABLE [WITH REDUCED PRECISION | WITHOUT REDUCED PRECISION]
<物化视图刷新选项> ::= REFRESH <刷新选项> {<刷新选项>} | NEVER REFRESH
<刷新选项> ::= <刷新方法> | <刷新时机> | <刷新规则> | <完全刷新方式>
<刷新方法> ::= FAST | COMPLETE | FORCE
<刷新时机> ::= ON DEMAND | ON COMMIT |
START WITH datetime_expr | NEXT datetime_expr |
START WITH datetime_expr NEXT datetime_expr
<刷新规则> ::= WITH PRIMARY KEY |
WITH ROWID
<完全刷新方式> ::= USING DEFAULT |
USING TRUNCATE |
USING DELETE
<查询改写选项>::= [DISABLE | ENABLE] QUERY REWRITE
<查询说明>::= <表查询> | <表连接>
<表查询>::= <子查询表达式> [ORDER BY子句]
<datetime_expr>::= SYSDATE [+<数值常量>]
考虑到物化视图会实际占用磁盘空间,首先创建表空间专门用来存放物化视图,在创建物化视图时指定该表空间
grant dba to demo;
create tablespace mv datafile ‘/dm8/mv/mv1.dbf’ size 32;
create materialized view demo.mv1 storage (on mv) as select * from demo.student;
select * from mv1;
9.2.3.1 刷新时机
9.2.3.1.1 手动刷新
更新基表数据,由于物化视图的更新方式为手动(创建时不指定自动则为默认),所以基本数据修改物化视图不会更新数据,需要手动刷新
update student set id=6 where name=‘dameng’;
select * from mv1;
refresh materialized view mv1;
select * from mv1;
9.2.3.1.2 自动刷新
物化日志的介绍:
当基表上有 DML 操作时,系统将变化记录在日志表里,然后使用这些日志刷新到物化视图,这种刷新方式为快速刷新。通过快速刷新避免了全量刷新,也降低了同步数据的开销。
首先需要创建物化日志,当不指定刷新方式时,默认为force(选择刷新)
创建自动刷新且方式为快速(fast):
alter table student add primary key(id);
create materialized view log on demo.student;
create materialized view demo.mv2 storage (on mv)
refresh fast on commit
as select * from demo.student;
insert into student values(4,‘xiaoming’,‘18946578734’,sysdate);
select * from mv2;
创建刷新方式为完全刷新
9.3 视图管理
可以修改物化视图的刷新时机为自动,删除物化视图日志,删除物化视图
十、序列
序列是一个数据库实体,通过它多个用户可以产生唯一整数值,可以用序列来自动地生成主关键字值。
创建序列的语法格式:
CREATE SEQUENCE [ <模式名>.] <序列名> [ <序列选项列表>];
<序列选项列表> ::= <序列选项>{<序列选项>}
<序列选项> ::=
INCREMENT BY <增量值>|
START WITH <初值>|
MAXVALUE <最大值>|
NOMAXVALUE|
MINVALUE <最小值>|
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE <缓存值>|
NOCACHE|
ORDER |
NOORDER |
GLOBAL |
LOCAL
10.1 创建序列
创建序列的初始值为1,增长步幅为2,最大值为100,最小值为1;
create sequence seq1 increment by 2 start with 7 maxvalue 100 minvalue 1;
insert into student values(seq1.nextval,‘liming’,‘15657577880’,sysdate);
select * from student;
10.2 修改序列
将序列的增幅步长修改为10,插入数据测试查看结果
alter sequence seq1 increment by 10;
insert into student values(seq1.nextval,‘liming’,‘15657577880’,sysdate);
select * from student;
10.3 删除序列
drop sequence seq1;
十一、同义词
同义词(Synonym)让用户能够为数据库的一个模式下的对象提供别名。同义词通过掩盖一个对象真实的名字和拥有者,并且对远程分布式的数据库对象给予了位置透明特性以此来提供了一定的安全性。同时使用同义词可以简化复杂的 SQL 语句。同义词可以替换模式下的表、视图、序列、函数、存储过程等对象
创建同义词的语法格式:
CREATE [OR REPLACE] [PUBLIC] SYNONYM [<模式名>.]<同义词名> FOR [<模式名>.]<对象名>
11.1 创建同义词
创建同义词,并测试查看结果
create synonym stu for student;
select * from stu;
删除同义词
drop synonym stu;
十二、自增列
DM 提供两种自增列方式:IDENTITY 自增列和 AUTO_INCREMENT 自增列。两者不能同时指定。
12.1 IDENTITY 自增列
<IDENTITY 子句 > 自增列不能使用 <DEFAULT 子句 >。<IDENTITY 子句 > 的种子和增量缺省值均为 1。
查看自增列的信息:
- IDENT_CURRENT:获得表上自增列的当前值;
- IDENT_SEED:获得表上自增列的种子信息;
- IDENT_INCR:获得表上自增列的增量信息。
创建表时指定自增列
create table emp(
id int identity(1,1),
name varchar(20),
sex char(5),
address varchar(50),
salary double);
insert into emp values(‘zhangsan’,‘man’,‘wuhan’,8000);
select * from emp;
12.2 AUTO_INCREMENT 自增列
AUTO_INCREMEN 列必须为主键或主键的部分,只支持整数类型(支持 TINYINT/SMALLINT/INT/BIGINT,不支持 dec(N, 0)等),不能违反主键的唯一性约束
AUTO_INCREMENT 关键字需要和 <AUTO_INCREMENT 子句 >、三个 AUTO_INCREMENT 相关 INI 参数(
- AUTO_INCREMENT_INCREMENT----动态会话级,表示 AUTO_INCREMENT 的步长。取值范围 1~65535。缺省值为 1
- AUTO_INCREMENT_OFFSET----动态会话级,表示 AUTO_INCREMENT 的基准偏移。取值范围 1~65535。缺省值为 1(只会在第一次插入数据时生效,简单来说就是第一次插入时的初始值)
- NO_AUTO_VALUE_ON_ZERO----动态会话级,表示 AUTO_INCREMENT 列插入 0 时,是否自动插入自增的下一个值。取值范围 0、1。0 否,插入 0;1 是,插入自增值。缺省值为 1)一起配合使用
alter session set ‘auto_increment_increment’=2;
alter session set ‘auto_increment_offset’=6;
alter session set ‘no_auto_value_on_zero’=1;
create table dept(
id int primary key auto_increment,
name varchar(30)
);
insert into dept(name) values(‘sales’);
insert into dept(name) values(‘computer’);
insert into dept(name) values(‘market’);
select * from dept;
十三、外部链接
外部链接对象(LINK)是 DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系
用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程
创建外部链接的语法格式:
CREATE [OR REPLACE] [PUBLIC] LINK <外部链接名> CONNECT [‘<连接库类型>’] WITH <登录名> IDENTIFIED BY <登录口令> USING ‘<外部连接串>’ [<OPTION子句>];
<连接库类型> ::=
DAMENG |
ORACLE |
ODBC |
DPI
<外部链接串>::=
<DAMENG外部链接串>|
<ORACLE外部链接串> |
<ODBC外部链接串> |
<DPI外部链接串>
<DAMENG外部链接串>::=[<连接类型>;]<服务器列表>
<连接类型>::=
PRIMARY FIRST |
STANDBY FIRST |
PRIMARY ONLY |
STANDBY ONLY
<服务器列表>::=
<服务器地址> |
<服务器地址>{,<服务器地址>}
<服务器地址>::=
<实例IP地址>/<实例端口号> |
<MAL IP地址>/<MAL端口号> |
<实例名>
<ORACLE外部链接串>::=
<tsn_name> |
|
<IP地址>/<服务名>
::=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<IP地址>)(PORT=<端口号>)))(CONNECT_DATA=(SERVICE_NAME=<服务名>)))
<ODBC外部链接串>::= <ODBC数据源DSN>
<DPI外部链接串>::= <IP地址>:<端口号> | <服务名>
<OPTION子句>:: =(<option项>{, <option项>})
<option项>:: =
LOCAL_CODE=<选项值> |
CONVERT_MODE=<选项值> |
BYTES_IN_CHAR=<选项值> |
DB_TYPE=<选项值> |
DATA_CHARSET=<选项值>
CASE_OPT=<选项值>
13.1 创建外部链接
通过外部链接,可以对远程服务器的对象进行查询或进行增删改操作,可以调用远程的过程或函数
使用外部链接进行查询或增删改的语法格式与普通格式基本一致,唯一的区别在于指定外部链接对象时需要使用如下格式:
<对象名> @ <外部链接名>
首先在两台服务器都配置dmmal.ini启用内部高速通道
服务器1:192.168.223.15
服务器2:192.168.223.20
1) 在每台机器的dm.ini修改MAL_INI=1设置打开
2) 并在和dm.ini目录下创建dmmal.ini,文件内容如下:
[mal_inst1]
mal_inst_name = DMSERVER
mal_host = 192.168.223.15
mal_port = 5282
[mal_inst2]
mal_inst_name = DMSERVER2
mal_host = 192.168.223.20
mal_port = 5283
3) 配置完成后需要重新启动数据库服务
[root@localhost DAMENG]# systemctl restart DmServiceDMSERVER.service
[root@localhost /dm8/data/DAMENG]# systemctl restart DmServiceDMSERVER2
创建服务器1:192.168.223.15的外部链接到服务器2:192.168.223.20
create public link link1 connect with SYSDBA
identified by SYSDBA using ‘192.168.223.20/5283’;
13.2 使用外部链接
使用外部链接,并验证连通性测试结果
在服务器2:192.168.223.20新建表并插入数据,在服务器1:192.168.223.15通过外部链接访问服务器2:192.168.223.20表中的数据并插入一条数据
注意:这里我一直报这个错:
SQL> select * from users@LINK1;
select * from users@LINK1;
第1 行附近出现错误[-6010]:连接丢失.
已用时间: 0.909(毫秒). 执行号:0.
原因是没有关闭被访问服务器的防火墙,导致网络通讯被阻
[root@localhost /dm8/data/DAMENG]# systemctl stop firewalld
13.3 删除外部链接
删除外部链接
drop link link2;