• 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值时,可以有重复的,而其他的则不能插入重复值。

  • 相关阅读:
    chapter2——习题
    chapter2 算法——程序的灵魂
    物理数据库设计 读书笔记
    从visio数据库脚本生成添加 MS_Description 的sql脚本
    SSIS包中CASE与NVARCHAR的恩怨
    又到年末
    delicious备份文件转入firefox书签,delicious2firefox 原创、开源
    软件架构设计 温昱著 读书笔记
    重构 读书笔记
    再遇SSIS包与MSSQL问题
  • 原文地址:https://www.cnblogs.com/sunshishi/p/4745757.html
Copyright © 2020-2023  润新知