oracle主键的设置方法

主键:
  1.主键约束: 一个表只能有一个主键约束。主键可以是单个字段,也可以是多个字段。无论是哪种情况,其所有字段都是NOT NULL。
  2.Unique约束:一个表可以有多个Unique约束,Unique的字段可以为NULL。
  3.主键与Unique:不同点在于一个表只能有一个主键约束,但是可以有多个Unique约束;主键所有字段都是not null,unique可以是

null;相同点在于都能保证唯一性。
  4.主键、Unique与索引:主键约束与Unique约束默认会成为索引。当主键和Unique有多个字段时,有索引前缀性问题,即where语

句中的条件必须有主键或者unique的第一个字段,否则不会使用索引。
          5. 外键与主键、Unique:外键必须为另外一张表(父表)的主键或者唯一索引。如果要添加记录,而父表中没有则报错。反之,如

果要删除父表中的记录,而子表中有记录,也会报错。但是如果在创建外键约束时,如果使用on delete cascade,则删除父表中数据时

,不报错而直接把子表关联的数据删除。
 如果要删除父表,则需要加上cascade constraints,此时子表的foreign key被去除,表中记录保持不变。
外键:

外键是该表是另一个表之间联接的字段
外键必须为另一个表中的主键
外键的用途是确保数据的完整性。它通常包括以下几种:
实体完整性,确保每个实体是唯一的(通过主键来实施).

 

oracle主键的设置方法有2种:
一种是设置自增长主键,另一种是生成唯一序列;
1.自增长主键

SQL> create table Prim_key_Increase_Test(
  2  id number(10) primary key,
  3  name varchar2(30)
  4  );

表已创建。

SQL> create sequence Prim_key_Incre_Sequence
  2  minvalue 1
  3  nomaxvalue
  4  start with 1
  5  increase by 1
  6  nocycle
  7  nocache;
increase by 1
*
第 5 行出现错误:
ORA-00933: SQL 命令未正确结束


SQL> 5
  5* increase by 1
SQL> c /increase/increment/
  5* increment by 1
SQL> r
  1  create sequence Prim_key_Incre_Sequence
  2  minvalue 1
  3  nomaxvalue
  4  start with 1
  5  increment by 1
  6  nocycle
  7* nocache

序列已创建。

SQL> create  trigger Prim_key_trigger before
  2  insert on Prim_key_Increase_Test for each row
  3  begin
  4  select Prim_key_Incre_Sequence.nextval into:New.id from dual;
  5  end;
  6  /

触发器已创建

SQL> commit;

提交完成。

SQL> insert into Prim_key_Increase_Test(id) values('181');

已创建 1 行。

SQL> select * from Prim_key_Increase_Test;

        ID NAME
---------- ------------------------------
         1

SQL> insert into Prim_key_Increase_Test(id) values('181');

已创建 1 行。

SQL> insert into Prim_key_Increase_Test(id) values('181');

已创建 1 行。

SQL> select * from Prim_key_Increase_Test;

        ID NAME
---------- ------------------------------
         1
         2
         3

2.唯一序列(转)
oracle的sys_guid
转自:http://hi.baidu.com/wangxi/blog/item/78cc36d39e121a093af3cf53.html
Oracle8i引入了SYS_GUID这个概念,它同Oracle管理员所使用的传统的序列(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);
 
REM - for some reason, the documentation uses raw(32)
create table use_guid_table(id raw(16));
insert into use_guid_table(sys_guid()); 
 
很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也就是说,在这样的数据集里一条记录的

创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不使用序列数感兴趣。这在对象在不同机器的

不同数据库里生成以及需要在后来合并到一起的情况下很有用。
 
但是,SYS_GUID所生成的值是一个16位的原始值。序列所生成的整数不会使用16位(的值),除非它达到了10的30次方(每个字节有

两位),而且数字是相当独特的:
 
SQL> select dump(123456789012345678901234567890) from dual;
 
DUMP(123456789012345678901234567890)
--------------------------------------------------------------
Typ=2 Len=16: 207,13,35,57,79,91,13,35,57,79,91,13,35,57,79,91 
 
较短的值就意味着用于表格和索引的存储空间更少,以及查询访问的时间更短。
 
使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在哪里。对于SYS_GUID而言,性能上的影响在

查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列

的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。
 
SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者

将它们作为Web参数来传递。
 
出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况

下。
在这里,我们不讨论 guid和序列器的优势,每个都会有特定环境下的需求。

在Oracle9i和Oracle 10g 里SYS_GUID产生得到的数据是32 位的,如:234E45F0077881AAE0430AA3034681AA

我这里要做的功能是将guid分割成为 Windows系统 ObjectId 的格式:{8-4-4-4-12} ,

就是利用substr进行分割,非常简单,具体代码如下:
/**
* 创建系统Object Id 格式的字符串,返回的结果如下:{234E45F0-077A-81AA-E043-0AA3034681AA}
*/
function CreateGUID  return varchar2
is
guid varchar(64);
begin
guid := SYS_GUID();
return
'{'||substr(guid,1,8)||'-'||substr(guid,9,4)||
'-'||substr(guid,13,4)||'-'||substr(guid,17,4)
||'-'||substr(guid,21,12)||'}';
end CreateGUID;

对于sys.guid的用法,还可以参考以下链接
http://blog.chinaunix.net/u/2996/showart_447610.html

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值