Oracle数据库生成主键
来源:互联网 发布:苹果激活策略查询软件 编辑:程序博客网 时间:2024/05/16 07:00
oracle主键
两种方法:自增主键sequence,SYS_GUID()生成唯一序列。
一、自增主键
创建一个表
create table test(
NID int PRIMARY KEY,
test1 varchar2(20),
test2 varchar2(20)
)
再建一个序列SEQ_TEST
create sequence SEQ_TEST
minvalue 1 --最小值 //可选
nomaxvalue --不设置最大值 //可选
start with 1 --从1开始计数
increment by 1 --每次加1个
nocycle --一直累加,不循环 //可选
nocache; --不建缓冲区 //可选
触发器##################
最好再建一个触发器来执行它!
//这样就不用主动调SELECT BJPRODUCT_SEQUENCE.NEXTVAL AS SEQNO FROM DUAL
//或values(BJPRODUCT_SEQUENCE.NEXTVAL,'wnj123')//可以直接用BJPRODUCT_SEQUENCE.NEXTVAL
CREATE OR REPLACE TRIGGER tg_test
BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null)
begin
select seq_test.nextval into:new.nid from dual;
end;
下面是测试
insert into test(nid,test1) values(6,'aaa')
insert into test(test1) values('bbb')
二、唯一序列
SYS_GUID() 生成32位的唯一编码
三、区别
sequence不适合将它用作并行或者远程环境里的PK
SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会比较困难
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wnjok/archive/2010/03/24/5410956.aspx
序列生成器sequence所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。
SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。
此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一的)。
SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。
create table use_seq_table(id integer);
create sequence use_seq_sequence;
insert into use_seq_table values (use_seq_sequence_value.nextval);
create table use_guid_table(id raw(16));
insert into use_guid_table(sys_guid());
对象在不同机器的不同数据库里生成以及需要将数据合并到一起的情况下,SYS_GUID很有用。
SYS_GUID()与sequence的作用及用法基本相同,都可以放在bi触发器中使用。
-- Create sequence
create sequence SEQ_ADDRESS
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;
create or replace trigger tri_address_bi before insert on address for each row
begin
if :new.id<0 or :new.id is null then
select seq_address.nextval into :new.id from dual;
--select substr(sys_guid(),1,32) into :new.id from dual;
end if;
end;
/
使用限制:
SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。
出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。
不过,使用SYS_GUID来做主键也不是不可以,但需要先转为 varchar2 较好。最好在使用时显示转换一下,如:substr(sys_guid(),1,32),直接使用RAW显然是不合适的。
直接插 raw 进入 varchar2 字段,发生隐式的转换,总不是太妥。曾见过因为大量隐式转换导致最后数据库崩溃,当然事后看是数据库的bug了。
本文来自:http://www.cnblogs.com/BradMiller/archive/2010/11/10/1873314.html
- Oracle数据库生成主键
- Oracle数据库生成主键
- oracle数据库的主键生成方式
- Oracle数据库采用那种主键生成策略
- Oracle数据库,生成自增主键
- Oracle到MySQL数据库迁移之--主键生成策略替换
- oracle 在插入数据库时自动生成主键
- oracle主键生成方式
- oracle主键生成方式
- oracle主键生成问题
- 数据库主键生成策略
- 数据库主键生成
- 数据库主键生成策略
- 数据库主键生成策略
- 数据库主键生成策略
- 程序控制数据库主键生成
- 数据库主键ID生成
- Oracle数据库管理--主键
- float,double数据类型在内存中的存储方式
- XML的读取和解析以及输出
- LSWM处理时,网络中断,出现错误
- 科学方法论--信息论、老鼠毒药问题、称球问题(全文)
- sdut2411 Pixel density
- Oracle数据库生成主键
- 第五周 程序阅读
- MFC改变编辑框背景、字体、颜色等
- Android 如何进行简单的反编译
- python 如何判断一个array是否是空?
- C语言五大内存分区介绍
- 数据挖掘、C#与Matlab混合编程链接
- Java的运行原理
- ZigBee小系统的运行原理