zoukankan      html  css  js  c++  java
  • oracle 建立主键与索引【转】

    此文转自:http://blog.sina.com.cn/s/blog_439f80c4010094n1.html

    创建主键:

    alter table T add primary key (V)

    T是表名,V是列名

    创建索引: 

    create index F2009100000NMINFOSYS_XIANG on f2009100000nminfo( SYS_XIANG );
    创建一般索引,索引名为表名+列名

    create unique index F2009100000NMINFOSYS_ZDM on f2009100000nminfoSYS_ZDM );

    创建唯一索引

    create BITMAP index F2009100000NMINFOSYS_XIANG on f2009100000nminfo( SYS_XIANG );
    创建位图索引

    完整语法如下:

    CREATE (UNIQUE|BITMAP) INDEX [用户名.]索引名 ON [用户名.]表名 (列名 [ ASC | DESC], [列名 [ ASC | DESC]]...)

    [ TABLESPACE 表空间名 ]

    [ PCTFREE 正整型数 ]

    [ INITRANS 正整型数 ]

    [ MAXTRANS 正整型数 ]

    [ 存储子句 ]

    [ LOGGING | NOLOGGING ]

    [ NOSORT ]

    Oracle中怎么知道表没有建立主键?

    一般的情况下,表的主键是必要的,没有主键的表可以说是不符合设计规范的。
    SELECT table_name FROM User_tables t  WHERE NOT EXISTS  
    (SELECT table_name FROM User_constraints c WHERE constraint_type = 'P' AND t.table_name=c.table_name)

    其它相关数据字典解释
    user_tables        表
    user_tab_columns   表的列
    user_constraints    约束
    user_cons_columns  约束与列的关系
    user_indexes       索引

    Oracle建立自增主键

    首先,你要有一张表!
    CREATE TABLE example(
    ID Number(4) NOT NULL PRIMARY KEY,
    NAME VARCHAR(25),
    PHONE VARCHAR(10),
    ADDRESS VARCHAR(50));
    如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看金庸读读琼瑶!
    然后,你需要一个自定义的sequence
    CREATE SEQUENCE emp_sequence
    INCREMENT BY 1 -- 每次加几个
    START WITH 1 -- 从1开始计数
    NOMAXVALUE -- 不设置最大值
    NOCYCLE -- 一直累加,不循环
    NOCACHE -- 不建缓冲区
    以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq
    ,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)
    书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:
    CREATE TRIGGER "触发器名称" BEFORE
    INSERT ON example FOR EACH ROW WHEN (new.id is null)
    begin
    select emp_sequence.nextval into: new.id from dual;
    end;
    打完收工!下面你就试试插入数据吧!
    INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');

     

     

    Primary Key与Unique Key

    Primary key 与Unique Key都是唯一性约束。但二者有很大的区别:

    1、Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求。

    2、一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY。

    下面以测试说明:

    SQL> create table t (a int,b int,c int,d int);

    Table created.

    SQL> desc t
     Name                                      Null?    Type
     ----------------------------------------- -------- -----------

     A                                                  NUMBER(38)
     B                                                  NUMBER(38)
     C                                                  NUMBER(38)
     D                                                  NUMBER(38)

    SQL> alter table t add constraint pk_t primary key (a,b);

    Table altered.

    SQL> desc t
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------

     A                                         NOT NULL NUMBER(38)
     B                                         NOT NULL NUMBER(38)
     C                                                  NUMBER(38)
     D                                                  NUMBER(38)

    可以看到A、B两个列都自动改为了NOT NULL

    SQL> alter table t modify (a int null);
    alter table t modify (a int null)
                          *
    ERROR at line 1:
    ORA-01451: column to be modified to NULL cannot be modified to NULL
    可以看到,列A不允许改为NULL

    SQL> alter table t drop constraint pk_t;

    Table altered.

    SQL> alter table t add constraint uk_t_1 unique (a,b);

    Table altered.

    SQL> desc t
     Name                                      Null?    Type
     ----------------------------------------- -------- -----------

     A                                                  NUMBER(38)
     B                                                  NUMBER(38)
     C                                                  NUMBER(38)
     D                                                  NUMBER(38)

    我们看到列A又变回了NULL。

    注意到,在删除主键时,列的NULLABLE会回到原来的状态。如果在创建主键后,对原来为NULL的主键列,显式设为NOT NULL,在删除主键后仍然是NOT NULL。比如在创建主键后,执行下面的操作,可以看到:

    SQL> alter table t modify (b int not null);

    Table altered.

    SQL> alter table t drop constraint pk_t;

    Table altered.

    SQL> desc t
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------

     A                                                  NUMBER(38)
     B                                         NOT NULL NUMBER(38)
     C                                                  NUMBER(38)
     D                                                  NUMBER(38)

    再做如下的实验:

    SQL> drop table t;

    Table dropped.

    SQL> create table t (a int,b int,c int,d int);

    Table created.

    SQL> alter table t add constraint uk_t_1 unique (a,b);

    Table altered.

    SQL> alter table t add constraint uk_t_2 unique (c,d);

    Table altered.

    可以看到可以增加两个UNIQUE KEY。看看能不能增加两个主键:

    SQL> alter table t add constraint pk_t primary key (c);

    Table altered.

    SQL> alter table t add constraint pk1_t primary key (d);
    alter table t add constraint pk1_t primary key (d)
                                      *
    ERROR at line 1:
    ORA-02260: table can have only one primary key
    由此可以看到一个表只能有一个主键。

    SQL> alter table t drop constraint pk_t;

    Table altered.

    SQL> insert into t (a ,b ) values (null,null);

    1 row created.

    SQL> /

    1 row created.

    SQL> insert into t (a ,b ) values (null,1);

    1 row created.

    SQL> /
    insert into t (a ,b ) values (null,1)
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SYS.UK_T_1) violated


    SQL> insert into t (a ,b ) values (1,null);

    1 row created.

    SQL> /
    insert into t (a ,b ) values (1,null)
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SYS.UK_T_1) violated

    主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。

  • 相关阅读:
    CV大牛/实验室主页
    mendeley使用技巧
    卷积理解与思考
    CMake构建OpenGL项目
    信号与系统学习(2)-跃阶信号
    信号与系统学习(1)-正弦信号和指数信号
    txt转换为mat
    matlab取整函数
    三维观察流水线的理解
    C#中文和UNICODE字符转换方法
  • 原文地址:https://www.cnblogs.com/lj821022/p/4478685.html
Copyright © 2011-2022 走看看