`

实现主键自动增长

阅读更多
Oracle 自动生成编号(实现sqlserver自增长字段)
oracle 自动编号

在access中有自动编号的数据类型,MSSQL和MYSQL也都有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值,而 oracle没有自动增长的数据类型,我们需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段,可以预见的是,有此功能,我们可以把数据从ACCESS、MSSQL或MYSQL迁移到oracle了!
create sequence type_id increment by 1 start with 1;
这句中,type_id为序列号的名称,每次增长为1,起始序号为1。
如果要删除序列,用drop sequence 序列名就可以了!!

序列可以保证多个用户对同一张表进行操作时生成唯一的整数,利用序列可以自动生成主关键字,序列只存在于数据字典中.

CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CYCLE |NOCYCLE}]
[{CACHE n|NOCACHE}];
INCREMENT BY--指定步长
START WITH--指定初始值
MAXVALUE--定义序列生成的最大编号.默认的MAXVALUE就是NOMAXVALUE,对于递增序列为10^27,对于递减序列为-1
MINVALUE--定义序列的最小编号,默认的MINVALUE为NOMINVALUE,对于递增序列为1,递减序列为-10^26.
CYCLE--配置序列在达到界限值时重复编号
NOCYCLE--达到界限值时不重复编号,这是默认值,当你试图生成MAXVALUE+1时将返回异常.
CACHE--定义在内存中保留的序列编号块的大小,默认值为20.
NOCACHE--强制数据词典对于生成的每个序列编号进行更新,保证在生成的编号中没有空缺,但这样会降低性能.

生成一个序列
CREATE SEQUENCE dept_deptid_seq
INCREAMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE;
//如果是用来生成主键值的话,不要用CYCLE选项,而且命名序列时最好能体现它的潜在用途以便于理解.

确认序列
SELECT sequence_name,min_value,max_value,increament_by,last_number
FROM user_sequences;
//如果你指定了NOCACHE选项,那么LAST_NUMBER列将显示下一可用的序列号.

使用NEXTVAL可以访问序列中的下一个编号,但问题常常出现在会话初始序列之前查询其当前序列号CURRVAL
CREATE SEQUENCE emp_seq
NOMAXVALUE
NOCYCLE;
然后查询
SELECT emp_seq.currval
FROM dual;
将返回错误,问题就在于你视图引用CURRVAL之前,在你的会话中并没有使用NEXTVAL先初始化此序列.
SELECT emp_seq.nextval
FROM dual;
这样再查询CURRVAL就不会出错了.

使用序列
INSERT INTO departments(department_id,department_name,location_id)
VALUES (dept_deptid_seq.NEXTVAL,'Support',2500);

对序列进行缓冲存储可以提高性能,因为这样就不必对每个生成的编号都更新数据字典表,只需要对每一组编号进行更新即可.这样,在我们查询NEXTVAL时就直接从缓冲中提取,速度将快很多,但是进行序列缓冲带来的负面影响就是当数据库被回滚时,比如说系统崩溃,手动ROLLBACK数据时,在缓冲中存储的序列值将会丢失,这也就是为什么会出现空缺(GAPS),如果生成序列时指定的是NOCACHE,那么可以在USER_SEQUENCES表里查询下一个可用的序列号值,这个查询并不会产生增加序列值的动作.

修改序列
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;
规则:
>必须为序列的所有者或者拥有ALTER特权
>修改对于以后的序列号生效
>序列必须是被删除然后重新生成(使所有相关的对象失效,并且失去相应的关联)
>修改时还要满足些其他的验证条件,比如说新的MAXVALUE不可以比现在的序列号低

删除序列
DROP SEQUENCE dept_deptid_seq;
>必须要时序列的所有者或者有DROP ANY SEQUENCE的权限

索引
索引是通过获取特定的行信息而与默认的全表扫描相比大大提高系统性能的数据结构.可是显式的手动建立,也可一由ORACLE自动生成,它们是与之索引的表相独立的,就是说,可以在任何时候建立或者删除索引而对基表或者其他索引无任何影响(当你删除表时,相关的索引将会被删除).
有两种索引
>唯一索引--当你定义了一列含有主键或者唯一键约束时将自动生成一个唯一索引(可以手动建立,但是推荐由ORACLE自动建立)
>非唯一索引--当你手动为一个查询中的连接建立一个外键索引来加速查询速度时

建立索引
CREATE INDEX index
ON table (column[,column]...);
e.g.
CREATE INDEX emp_last_name_idx
ON employees(last_name);

何时使用索引
>当一个列包含的数值范围较大时
>当一列包含大量空值时
>一个或者多个列经常一起在WHERE子句或者JOIN子句中使用时
>表非常大,但是大多数的查询只要求检索少于2-4个百分点的行记录

何时不该使用索引
>表很小时
>列并不经常作为查询中的条件使用时
>大多数查询都检索多于4个百分点的行记录
>表经常被更新
>索引列被作为表达式的一部分引用

索引虽然可以很大程度提高检索性能,但是越多的索引,意味着在DML操作之后ORACLE就将花越多的功夫去更新索引.所以,一定要适时使用,

确认索引
查询数据字典视图USER_INDEXES和USER_IND_COLUMNS可以检索到索引的相关信息
SELECT ic.index_name,ic.column_name,
ic.column_position col_pos,ix.uniqueness
FROM user_indexes ix,user_ind_columns ic
WHERE ic.inde_name=ix.index_name
AND ic.table_name='EMPLOYEES';

基于函数的索引
CREATE INDEX upper_dept_name_idx
ON departments(UPPER(department_name));
//但是如果想保证ORACLE使用索引而不是全表扫描就必须保证函数值非空,就是需要加个WHERE子句指定非空如
SELECT *
FROM employees
WHERE UPPER(last_name_ IS NOT NULL
ORDER BY UPPER(last_name);
如果没有WHERE子句,则将会进行全表扫描非使用索引了.

删除索引
DROP INDEX index;
//当你删除一个表时,索引和约束将会自动删除,但是视图和序列将会保留.

同义词
同义词经常用来通过为一个本地或者远程对象给定一个通用的名字来简化SQL.同义词可以指向一个表,视图,序列,过程,函数或者本地数据库中的包,或者通过一个数据库连接指向另一个数据库中的对象.公共同义词可供所有用户使用,而专用同义词则只能供其所有者或者获得了相关授权的帐户所有者使用.
比如说SCOTT拥有表EMP,所有用户都使用自己的用户名登陆数据库,并且必须引用该表,即SCOTT.EMP,如果我们为其生成一个同义词EMP,每个对该表具有相关特权的人都可以简单地在自己的SQL或者PL/SQL语句中以EMP的形式来引用它,不需要再指出所有者了.

CREATE [PUBLIC] SYNONYM synonym
FOR object;

e.g.
CREATE SYNONYM d_sum
FOR dept_sum_vu;

DROP SYNONYM d_sum;

CREATE PUBLIC SYNONYM dept
FOR alice.departments;

DROP PUBLIC SYNONYM dept;
//仅仅数据库管理员可以删除公共同义词


关于Oracle的序列(Sequence)使用
序列是一数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主键值。对我们程序员来讲,精力时间有限,我们只学最有用的知识。大家请看:
1) 建立序列命令
CREATE SEQUENCE [user.]sequence_name
[increment by n]
[start with n]
[maxvalue n | nomaxvalue]
[minvalue n | nominvalue];
[NOCYCLE]  --
INCREMENT BY: 指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
START WITH:指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。
MAXVALUE:指定序列可生成的最大值。
NOMAXVALUE:为升序指定最大值为1027,为降序指定最大值为-1。
MINVALUE:指定序列的最小值。
NOMINVALUE:为升序指定最小值为1。为降序指定最小值为-1026。
NOCYCLE:一直累加,不循环
2) 更改序列命令
ALTERSEQUENCE [user.]sequence_name
[INCREMENT BY n]
[MAXVALUE n| NOMAXVALUE ]
[MINVALUE n | NOMINVALUE];
修改序列可以:
    修改未来序列值的增量。
    设置或撤消最小值或最大值。
    改变缓冲序列的数目。
    指定序列号是否是有序。

注意:
1,第一次NEXTVAL返回的是初始值
2,可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .

3) 删除序列命令
DROP SEQUENCE [user.]sequence_name;
用于从数据库中删除一序列。
4)牛刀小试
     4.1)创建一个序列号的语句:
-- Create sequence
create sequence NCME_QUESTION_SEQ
minvalue 1
maxvalue 999999999999
start with 1
increment by 1
nocache;

/////////////////////////////////////////////////////////////////////////////////////////
4.2)SQL中取序列号的用法:
SELECT NCME_QUESTION_SEQ.nextval FROM dual
SELECT NCME_QUESTION_SEQ.CURRVAL FROM dual

注意:在使用序列的时候,有时需要有用户名,就像这样:
insert into system.CONSERVATOR(CONSERVATORNAME,CONPASS,CONTRUENAME,CONSEX,CONID)values('JG','123456','000',0, system.CONID.nextval);

0
0
分享到:
评论

相关推荐

    oracle触发器实现主键自动增长

    在Oracle数据库中,实现主键自动增长是一种常见的需求,尤其在设计高并发、大数据量的系统时,确保每个记录都有一个唯一且连续的标识符变得至关重要。本文将深入探讨如何利用Oracle触发器来实现这一功能,同时也会...

    oracle设置主键自动增长

    为了实现主键自动增长,我们需要先创建一个序列。序列是一种用于生成一系列数值的对象,可以用于自动为主键生成唯一的值。 ```sql CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次增加的值 START WITH 1 -- ...

    oracle序列主键自增长

    为了实现主键自动增长,Oracle提供了序列(Sequences)这一特性,它能按照预设的规则(通常是递增)生成唯一的整数。本文将深入探讨Oracle序列主键自增长的工作原理、创建方法以及如何在表中应用。 **1. Oracle序列...

    oracle设置主外键即主键序列自动增长

    #### 二、创建序列和触发器实现主键自动增长 为了实现主键的自动增长,我们需要创建两个序列和两个触发器。 ##### 1. 创建序列 ```sql CREATE SEQUENCE userinfo_sequence; CREATE SEQUENCE groupinfo_sequence; `...

    oracle主键自动增长

    ### Oracle主键自动增长知识点详解 #### 一、Oracle序列(Sequence)的使用方法 在Oracle数据库中,并没有像MySQL那样的自动增长字段特性,因此在实际应用中,我们常常需要手动实现这一功能。序列(Sequence)是...

    Oracle数据库创建表tuser设置主键自动增长

    ### Oracle数据库创建表tuser设置主键自动增长 在Oracle数据库中,创建一张包含自动增长主键的表是一项常见的需求。本文将详细介绍如何在Oracle环境中创建一个名为`tuser`的表,并实现其主键自动增长的功能。此外,...

    mysql实现char类型主键自增长

    在MySQL数据库管理中,自增长主键是一种常见的设计模式,主要用于自动为每一行记录生成一个唯一的标识符。然而,这种自增长通常与整型数据类型(如INT)关联,而较少见于字符型数据(如CHAR)。本文将深入探讨如何在...

    powerdesigner创建oracle_数据库表,设置表主键列为自动增长

    ### PowerDesigner 创建 Oracle 数据库表并设置主键自动增长 #### 一、PowerDesigner与Oracle数据库集成概述 PowerDesigner是一款强大的数据库设计工具,它能够帮助开发者进行数据建模、概念设计以及物理数据库的...

    oracle中的sequence实现主键增长

    总的来说,Oracle中的Sequence提供了一种可靠且灵活的方式来生成序列号,适用于需要自动增长主键的场景。通过合理配置和使用,可以有效避免数据冲突,提高插入数据的效率。在设计数据库时,应根据具体业务需求来决定...

    深入Mysql,SqlServer,Oracle主键自动增长的设置详解

    在MySQL中,主键自动增长是通过`auto_increment`关键字实现的。当你创建一个表并定义某个字段为`auto_increment`类型的主键时,如`id int auto_increment primary key not null`,每次插入新记录且不提供该字段的值...

    SQL Server设置主键自增长列(使用sql语句实现)

    当创建新表时,你可以直接定义一个字段为`identity`类型,这会使其成为主键并自动增长。以下示例创建了一个名为`tb`的表,其中`id`字段是主键,并且设置自增长起始值为1,每次增加1: ```sql CREATE TABLE tb ( ...

    MyBatis主键自动生成方法.pdf

    综上所述,MyBatis提供了灵活的方式来处理主键自动生成,无论是对支持自动增长的数据库,还是需要使用序列的数据库,都能进行有效的适配。通过正确配置`useGeneratedKeys`和`selectKey`元素,开发者可以轻松地在Java...

    在hibernate中实现oracle的自动增长

    Oracle数据库提供了强大的序列(sequence)功能来支持自动增长,这是实现主键自动生成的有效手段。与MySQL或SQL Server等其他数据库系统不同,Oracle不直接支持自增列(auto-increment column),而是通过序列(sequence)...

    mysql取得自动增长的主键值

    ### MySQL获取自动增长的主键值 在MySQL数据库中,自动增长字段是一种非常有用的特性,尤其是在需要为主键分配唯一标识符的情况下。通过设置一个列的`AUTO_INCREMENT`属性,每当向表中插入新记录时,该列的值会自动...

    oracle中用序列实现自动增长值

    在Oracle数据库系统中,与SQL Server中的`IDENTITY`特性类似,我们可以通过使用序列(Sequences)来实现字段的自动增长值。序列是一种特殊的数据库对象,它可以生成一系列有序的数值,通常用于为表的主键字段提供...

    自动增长列的编号生成

    本文将详细探讨一种实现自动增长列编号的方法,并通过一个具体的示例进行说明。 #### 核心概念 1. **自动增长列**: 在数据库设计中,自动增长列是一种特殊的字段类型,它可以在插入新记录时自动递增。这种特性常...

    hibernate中自动生成主键的办法

    综上所述,Hibernate提供了丰富的主键生成策略,涵盖了从简单的自动增长到复杂的分布式唯一ID生成。开发者应根据具体的应用需求和数据库特性,选择最合适的主键生成策略,以确保系统的稳定性和性能。无论是追求高...

Global site tag (gtag.js) - Google Analytics