oracle 主键索引和unique 索引 和sql server 主键的异同

来源:互联网 发布:周末是否算法定节假日 编辑:程序博客网 时间:2024/05/19 23:02

 

SQL> create table test2(
  2  id int,
  3  name varchar2(10)
  4  );

表已创建。

SQL> alter table test2 add constraint test2_id   primary key (id);

表已更改。

SQL> insert into test2 values(1,'1');

已创建 1 行。

SQL> insert into test2 values(3,'3');

已创建 1 行。

SQL> select rowid,id from test2;

ROWID                      ID
------------------ ----------
AAARW+AABAAAVfKAAA          1
AAARW+AABAAAVfKAAB          3

SQL> insert into test2 values(2,'2');

已创建 1 行。

SQL> select rowid,id from test2;

ROWID                      ID
------------------ ----------
AAARW+AABAAAVfKAAA          1
AAARW+AABAAAVfKAAC          2
AAARW+AABAAAVfKAAB          3

 


SQL> insert into test2 values(6,'6');

已创建 1 行。

SQL> insert into test2 values(7,'7');

已创建 1 行。

SQL> insert into test2 values(4,'4');

已创建 1 行。

SQL> select * from test2;

        ID NAME
---------- --------------------
         1 1
         3 3
         2 2
         6 6
         7 7
         4 4

 

SQL> select rowid,id,name from test2;

ROWID                                      ID NAME
------------------ ---------- --------------------
AAARW+AABAAAVfKAAA          1    1
AAARW+AABAAAVfKAAB          3    3
AAARW+AABAAAVfKAAC          2    2
AAARW+AABAAAVfKAAD          6    6
AAARW+AABAAAVfKAAE          7     7
AAARW+AABAAAVfKAAF          4     4

已选择6行。

 

 

这说明 oracle创建的主键 不是聚集索引,而是普通的 b树索引,因为 插入后的数据不按主键的聚集 存储,通过工具查看 oracle主键只是一个 不可为空的唯一索引 且按照 rowed 升序排列

DROP TABLE SYS.TEST2 CASCADE CONSTRAINTS;

CREATE TABLE SYS.TEST2

         (

         ID   NUMBER (38) NOT NULL,

         NAME VARCHAR2 (10),

         CONSTRAINT TEST2_ID PRIMARY KEY (ID)

         )

         TABLESPACE SYSTEM

         LOGGING

         NOCACHE

         STORAGE (BUFFER_POOL DEFAULT);

 

 

 

 

----------------------------------------

SQL> create table test3(
  2  id int,
  3  name varchar2(10)
  4  );

表已创建。

SQL> alter table test3 modify id unique;

SQL> insert into test3 (name) values('1');

已创建 1 行。

SQL> insert into test3 (name) values('2');

已创建 1 行。

 

oracle  的 unique 索引可以插入 null 值 ,而primary  key 却不可以 

 

SQL> select rowid ,id,name from test3;

ROWID                      ID NAME
------------------ ---------- --------------------
AAARXCAABAAAVvKAAA            1
AAARXCAABAAAVvKAAB            2

 

 

同样的问题 归于 sql server

 

--以下是工具生成的建表 sql

USE [sl]

GO

/****** 对象:  Table [dbo].[test2]    脚本日期: 07/05/2011 23:48:17 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[test2](

    [id] [int] NOT NULL,

    [name] [varchar](50) NULL,

 CONSTRAINT [PK_test2] PRIMARY KEY CLUSTERED

(

    [id] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

 

GO

SET ANSI_PADDING OFF

 

--插入数据

insert into test2 values(1,'1')

 insert into test2 values(3,'3')

 insert into test2 values(2,'2')

 insert into test2 values(6,'6')

 insert into test2 values(7,'7')

 insert into test2 values(4,'4')

--查询

原创粉丝点击