精华内容
下载资源
问答
  • 主要介绍了SQLServer主键和唯一约束的区别,需要的朋友可以参考下
  • Oracle主键约束、唯一键约束、唯一索引的区别 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别SQL> select * from

    Oracle主键约束、唯一键约束、唯一索引的区别


    一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

     

    接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。

    SQL> select * fromv$version;

     

    BANNER

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

    Oracle Database 11g EnterpriseEdition Release 11.2.0.1.0 - Production

    PL/SQL Release 11.2.0.1.0 -Production

    CORE   11.2.0.1.0     Production

    TNS for Linux: Version 11.2.0.1.0 -Production

    NLSRTL Version 11.2.0.1.0 -Production

     

    SQL> create tabletest (          

      2  id int,

      3  namevarchar2(20),

      4  constraintpk_testprimarykey(id))

      5  tablespaceusers;

     

    Table created.

     

    SQL> selectconstraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME               C

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

    PK_TEST                       P

     

    在test表中,我们指定了ID列作为主键,Oracle数据库会自动创建一个同名的唯一索引:

    SQL> selectindex_name, index_type, uniqueness, tablespace_name

      2  fromuser_indexes

      3  wheretable_owner='SCOTT'

      4  and table_name ='TEST';

     

    INDEX_NAME          INDEX_TYPE          UNIQUENES TABLESPACE_NAME

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

    PK_TEST             NORMAL              UNIQUE   USERS

     

    此时,如果我们再试图在ID列上创建一个唯一索引,Oracle会报错,因为该列上已经存在一个唯一索引:

    SQL> create uniqueindex idx_test_uk on test(id);

    create unique index idx_test_uk ontest(id)

                                           *

    ERROR at line 1:

    ORA-01408: such column list alreadyindexed

    即使创建非唯一索引也不行:

    SQL> create indexidx_test_id on test(id);

    create index idx_test_id ontest(id)

                                    *

    ERROR at line 1:

    ORA-01408: such column list alreadyindexed

     

    那么唯一键约束的情况是怎样的呢?

    SQL> drop table testpurge;

     

    Table dropped.

     

    SQL> create tabletest(

      2  id int,

      3  namevarchar2(20),

      4  constraintuk_testunique(id));

     

    Table created.

     

    SQL> selectconstraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME               C

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

    UK_TEST                       U

     

    查看此时的索引情况:

    SQL> selectindex_name, index_type, uniqueness, tablespace_name

      2  fromuser_indexes

      3  wheretable_owner='SCOTT'

      4  and table_name ='TEST';

     

    INDEX_NAME          INDEX_TYPE          UNIQUENES TABLESPACE_NAME

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

    UK_TEST             NORMAL              UNIQUE   USERS

    Oracle同样自动创建了一个同名的唯一索引,而且也不允许再在此列上创建唯一索引或非唯一索引。

     

    我们知道,主键约束要求列值非空(NOT NULL),那么唯一键约束是否也要求非空呢?

    SQL> insert intotest values(1, 'Sally');

     

    1 row created.

     

    SQL> insert intotest values(null, 'Tony');

     

    1 row created.

     

    SQL> insert intotest values(null, 'Jack');

     

    1 row created.

     

    SQL> select * fromtest;

     

           ID NAME

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

            1 Sally

              Tony

              Jack

    从实验结果来看,唯一键约束并没有非空要求。

     

    接下来我们看看唯一索引对列值的非空要求有什么不同。

    SQL> drop table testpurge;

     

    Table dropped.

     

    SQL> create tabletest(

      2  id int,

      3  namevarchar2(20));

     

    Table created.

     

    SQL> create uniqueindex idx_test_id on test (id);

     

    Index created.

     

    SQL> insert intotest values(1, 'Sally');

     

    1 row created.

     

    SQL> insert intotest values(null, 'Tony');

     

    1 row created.

     

    SQL> insert intotest values(null, 'Jack');

     

    1 row created.

     

    SQL> select * fromtest;

     

           ID NAME

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

            1 Sally

              Tony

              Jack

    通过实验,我们看出唯一索引与唯一键约束一样对列值非空不做要求。

     

    如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响?

    SQL> drop table testpurge;

     

    Table dropped.

     

    SQL> create tabletest(

      2  id int,

      3  namevarchar2(20),

      4  constraint uk_testunique(id));

     

    Table created.

     

    SQL> selectindex_name, index_type, uniqueness from user_indexes;

     

    INDEX_NAME                    INDEX_TYPE                 UNIQUENES

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

    UK_TEST                       NORMAL                     UNIQUE

     

    SQL> alter tabletest disable constraint uk_test;

     

    Table altered.

     

    SQL> selectindex_name, index_type, uniqueness from user_indexes;

     

    no rows selected

    当主键约束或者唯一键约束失效时,Oracle会删除隐式创建的唯一索引。

     

    如果我们先创建唯一索引,再创建主键或者唯一键约束,情况又会怎样呢?

    SQL> drop table testpurge;

     

    Table dropped.

     

    SQL> create tabletest(

      2  id int,

      3  namevarchar2(20));

     

    Table created.

     

    SQL> create uniqueindex idx_test_id on test (id);

     

    Index created.

     

    SQL> selectindex_name, index_type, uniqueness

      2  fromuser_indexes

      3  where table_owner ='SCOTT'

      4  and table_name ='TEST';

     

    INDEX_NAME                    INDEX_TYPE                 UNIQUENES

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

    IDX_TEST_ID                   NORMAL                     UNIQUE

     

    SQL> alter tabletest add constraint uk_test unique (id);

     

    Table altered.

     

    SQL> selectindex_name, index_type, uniqueness

      2  fromuser_indexes

      3  where table_owner ='SCOTT'

      4  and table_name ='TEST';

     

    INDEX_NAME                    INDEX_TYPE                 UNIQUENES

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

    IDX_TEST_ID                   NORMAL                     UNIQUE

     

    SQL> selectconstraint_name, constraint_type

      2  fromuser_constraints

      3  where table_name ='TEST';

     

    CONSTRAINT_NAME               C

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

    UK_TEST                       U

     

    SQL> alter tabletest disable constraint uk_test;

     

    Table altered.

     

    SQL> selectconstraint_name, constraint_type, status

      2  fromuser_constraints

      3  where table_name ='TEST';

     

    CONSTRAINT_NAME               C STATUS

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

    UK_TEST                       U DISABLED

     

    SQL> selectindex_name, index_type, uniqueness, status

      2  fromuser_indexes

      3  where table_owner ='SCOTT'

      4  and table_name ='TEST';

     

    INDEX_NAME                    INDEX_TYPE                 UNIQUENES STATUS

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

    IDX_TEST_ID                   NORMAL                     UNIQUE   VALID

     

    实验结果表明,先创建的唯一索引不受约束失效的影响。

     

    总结如下:

    (1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;

    (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;

    (3)相同字段序列不允许重复创建索引;

    展开全文
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别SQL> select * from v$version;   BANNER ------...

    一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

     

    接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。

    SQL> select * from v$version;

     

    BANNER

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

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

    PL/SQL Release 11.2.0.1.0 - Production

    CORE 11.2.0.1.0 Production

    TNS for Linux: Version 11.2.0.1.0 - Production

    NLSRTL Version 11.2.0.1.0 - Production

     

    SQL> create table test (

    2 id int,

    3 name varchar2(20),

    4 constraint pk_test primary key(id))

    5 tablespace users;

     

    Table created.

     

    SQL> select constraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME C

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

    PK_TEST P

     

    在test表中,我们指定了ID列作为主键,Oracle数据库会自动创建一个同名的唯一索引:

    SQL> select index_name, index_type, uniqueness, tablespace_name

    2 from user_indexes

    3 where table_owner='SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME

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

    PK_TEST NORMAL UNIQUE USERS

     

    此时,如果我们再试图在ID列上创建一个唯一索引,Oracle会报错,因为该列上已经存在一个唯一索引:

    SQL> create unique index idx_test_uk on test(id);

    create unique index idx_test_uk on test(id)

    *

    ERROR at line 1:

    ORA-01408: such column list already indexed

    即使创建非唯一索引也不行:

    SQL> create index idx_test_id on test(id);

    create index idx_test_id on test(id)

    *

    ERROR at line 1:

    ORA-01408: such column list already indexed

     

    那么唯一键约束的情况是怎样的呢?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20),

    4 constraint uk_test unique(id));

     

    Table created.

     

    SQL> select constraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME C

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

    UK_TEST U

     

    查看此时的索引情况:

    SQL> select index_name, index_type, uniqueness, tablespace_name

    2 from user_indexes

    3 where table_owner='SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME

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

    UK_TEST NORMAL UNIQUE USERS

    Oracle同样自动创建了一个同名的唯一索引,而且也不允许再在此列上创建唯一索引或非唯一索引。

     

    我们知道,主键约束要求列值非空(NOT NULL),那么唯一键约束是否也要求非空呢?

    SQL> insert into test values(1, 'Sally');

     

    1 row created.

     

    SQL> insert into test values(null, 'Tony');

     

    1 row created.

     

    SQL> insert into test values(null, 'Jack');

     

    1 row created.

     

    SQL> select * from test;

     

    ID NAME

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

    1 Sally

    Tony

    Jack

    从实验结果来看,唯一键约束并没有非空要求。

     

     

    接下来我们看看唯一索引对列值的非空要求有什么不同。

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20));

     

     

    Table created.

     

    SQL> create unique index idx_test_id on test (id);

     

    Index created.

     

    SQL> insert into test values(1, 'Sally');

     

    1 row created.

     

    SQL> insert into test values(null, 'Tony');

     

    1 row created.

     

    SQL> insert into test values(null, 'Jack');

     

    1 row created.

     

    SQL> select * from test;

     

    ID NAME

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

    1 Sally

    Tony

    Jack

    通过实验,我们看出唯一索引与唯一键约束一样对列值非空不做要求。

     

     

    如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20),

    4 constraint uk_test unique(id));

     

    Table created.

     

    SQL> select index_name, index_type, uniqueness from user_indexes;

     

    INDEX_NAME INDEX_TYPE UNIQUENES

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

    UK_TEST NORMAL UNIQUE

     

    SQL> alter table test disable constraint uk_test;

     

    Table altered.

     

    SQL> select index_name, index_type, uniqueness from user_indexes;

     

    no rows selected

    当主键约束或者唯一键约束失效时,Oracle会删除隐式创建的唯一索引。

     

    如果我们先创建唯一索引,再创建主键或者唯一键约束,情况又会怎样呢?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20));

     

    Table created.

     

    SQL> create unique index idx_test_id on test (id);

     

    Index created.

     

    SQL> select index_name, index_type, uniqueness

    2 from user_indexes

    3 where table_owner = 'SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES

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

    IDX_TEST_ID NORMAL UNIQUE

     

    SQL> alter table test add constraint uk_test unique (id);

     

    Table altered.

     

    SQL> select index_name, index_type, uniqueness

    2 from user_indexes

    3 where table_owner = 'SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES

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

    IDX_TEST_ID NORMAL UNIQUE

     

    SQL> select constraint_name, constraint_type

    2 from user_constraints

    3 where table_name = 'TEST';

     

    CONSTRAINT_NAME C

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

    UK_TEST U

     

    SQL> alter table test disable constraint uk_test;

     

    Table altered.

     

    SQL> select constraint_name, constraint_type, status

    2 from user_constraints

    3 where table_name = 'TEST';

     

    CONSTRAINT_NAME C STATUS

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

    UK_TEST U DISABLED

     

    SQL> select index_name, index_type, uniqueness, status

    2 from user_indexes

    3 where table_owner = 'SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES STATUS

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

    IDX_TEST_ID NORMAL UNIQUE VALID

     

    实验结果表明,先创建的唯一索引不受约束失效的影响。

     

    总结如下:

    (1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;

    (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;

    (3)相同字段序列不允许重复创建索引;

    展开全文
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别SQL> select * from v$version;   BANNER ----------
     
    

    一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

     

    接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。

    SQL> select * from v$version;

     

    BANNER

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

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

    PL/SQL Release 11.2.0.1.0 - Production

    CORE    11.2.0.1.0      Production

    TNS for Linux: Version 11.2.0.1.0 - Production

    NLSRTL Version 11.2.0.1.0 - Production

     

    SQL> create table test (          

      2  id int,

      3  name varchar2(20),

      4  constraint pk_test primary key(id))

      5  tablespace users;

     

    Table created.

     

    SQL> select constraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME                C

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

    PK_TEST                        P

     

    在test表中,我们指定了ID列作为主键,Oracle数据库会自动创建一个同名的唯一索引:

    SQL> select index_name, index_type, uniqueness, tablespace_name

      2  from user_indexes

      3  where table_owner='SCOTT'

      4  and table_name = 'TEST';

     

    INDEX_NAME           INDEX_TYPE           UNIQUENES TABLESPACE_NAME

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

    PK_TEST              NORMAL               UNIQUE    USERS

     

    此时,如果我们再试图在ID列上创建一个唯一索引,Oracle会报错,因为该列上已经存在一个唯一索引:

    SQL> create unique index idx_test_uk on test(id);

    create unique index idx_test_uk on test(id)

                                            *

    ERROR at line 1:

    ORA-01408: such column list already indexed

    即使创建非唯一索引也不行:

    SQL> create index idx_test_id on test(id);

    create index idx_test_id on test(id)

                                     *

    ERROR at line 1:

    ORA-01408: such column list already indexed

     

    那么唯一键约束的情况是怎样的呢?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

      2  id int,

      3  name varchar2(20),

      4  constraint uk_test unique(id));

     

    Table created.

     

    SQL> select constraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME                C

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

    UK_TEST                        U

     

    查看此时的索引情况:

    SQL> select index_name, index_type, uniqueness, tablespace_name

      2  from user_indexes

      3  where table_owner='SCOTT'

      4  and table_name = 'TEST';

     

    INDEX_NAME           INDEX_TYPE           UNIQUENES TABLESPACE_NAME

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

    UK_TEST              NORMAL               UNIQUE    USERS

    Oracle同样自动创建了一个同名的唯一索引,而且也不允许再在此列上创建唯一索引或非唯一索引。

     

    我们知道,主键约束要求列值非空(NOT NULL),那么唯一键约束是否也要求非空呢?

    SQL> insert into test values(1, 'Sally');

     

    1 row created.

     

    SQL> insert into test values(null, 'Tony');

     

    1 row created.

     

    SQL> insert into test values(null, 'Jack');

     

    1 row created.

     

    SQL> select * from test;

     

            ID NAME

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

             1 Sally

               Tony

               Jack

    从实验结果来看,唯一键约束并没有非空要求。

     

    接下来我们看看唯一索引对列值的非空要求有什么不同。

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

      2  id int,

      3  name varchar2(20));

     

    Table created.

     

    SQL> create unique index idx_test_id on test (id);

     

    Index created.

     

    SQL> insert into test values(1, 'Sally');

     

    1 row created.

     

    SQL> insert into test values(null, 'Tony');

     

    1 row created.

     

    SQL> insert into test values(null, 'Jack');

     

    1 row created.

     

    SQL> select * from test;

     

            ID NAME

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

             1 Sally

               Tony

               Jack

    通过实验,我们看出唯一索引与唯一键约束一样对列值非空不做要求。

     

    如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

      2  id int,

      3  name varchar2(20),

      4  constraint uk_test unique(id));

     

    Table created.

     

    SQL> select index_name, index_type, uniqueness from user_indexes;

     

    INDEX_NAME                     INDEX_TYPE                  UNIQUENES

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

    UK_TEST                        NORMAL                      UNIQUE

     

    SQL> alter table test disable constraint uk_test;

     

    Table altered.

     

    SQL> select index_name, index_type, uniqueness from user_indexes;

     

    no rows selected

    当主键约束或者唯一键约束失效时,Oracle会删除隐式创建的唯一索引。

     

    如果我们先创建唯一索引,再创建主键或者唯一键约束,情况又会怎样呢?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

      2  id int,

      3  name varchar2(20));

     

    Table created.

     

    SQL> create unique index idx_test_id on test (id);

     

    Index created.

     

    SQL> select index_name, index_type, uniqueness

      2  from user_indexes

      3  where table_owner = 'SCOTT'

      4  and table_name = 'TEST';

     

    INDEX_NAME                     INDEX_TYPE                  UNIQUENES

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

    IDX_TEST_ID                    NORMAL                      UNIQUE

     

    SQL> alter table test add constraint uk_test unique (id);

     

    Table altered.

     

    SQL> select index_name, index_type, uniqueness

      2  from user_indexes

      3  where table_owner = 'SCOTT'

      4  and table_name = 'TEST';

     

    INDEX_NAME                     INDEX_TYPE                  UNIQUENES

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

    IDX_TEST_ID                    NORMAL                      UNIQUE

     

    SQL> select constraint_name, constraint_type

      2  from user_constraints

      3  where table_name = 'TEST';

     

    CONSTRAINT_NAME                C

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

    UK_TEST                        U

     

    SQL> alter table test disable constraint uk_test;

     

    Table altered.

     

    SQL> select constraint_name, constraint_type, status

      2  from user_constraints

      3  where table_name = 'TEST';

     

    CONSTRAINT_NAME                C STATUS

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

    UK_TEST                        U DISABLED

     

    SQL> select index_name, index_type, uniqueness, status

      2  from user_indexes

      3  where table_owner = 'SCOTT'

      4  and table_name = 'TEST';

     

    INDEX_NAME                     INDEX_TYPE                  UNIQUENES STATUS

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

    IDX_TEST_ID                    NORMAL                      UNIQUE    VALID

     

    实验结果表明,先创建的唯一索引不受约束失效的影响。

     

    总结如下:

    (1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;

    (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;

    (3)相同字段序列不允许重复创建索引;

     

    来源:http://blog.sina.com.cn/s/blog_6c651b300100mpon.html

    展开全文
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别SQL> select * from v$version;   BANNER -----...

    一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

     

    接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。

    SQL> select * from v$version;

     

    BANNER

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

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

    PL/SQL Release 11.2.0.1.0 - Production

    CORE 11.2.0.1.0 Production

    TNS for Linux: Version 11.2.0.1.0 - Production

    NLSRTL Version 11.2.0.1.0 - Production

     

    SQL> create table test (

    2 id int,

    3 name varchar2(20),

    4 constraint pk_test primary key(id))

    5 tablespace users;

     

    Table created.

     

    SQL> select constraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME C

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

    PK_TEST P

     

    test表中,我们指定了ID列作为主键,Oracle数据库会自动创建一个同名的唯一索引:

    SQL> select index_name, index_type, uniqueness, tablespace_name

    2 from user_indexes

    3 where table_owner='SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME

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

    PK_TEST NORMAL UNIQUE USERS

     

    此时,如果我们再试图在ID列上创建一个唯一索引,Oracle会报错,因为该列上已经存在一个唯一索引:

    SQL> create unique index idx_test_uk on test(id);

    create unique index idx_test_uk on test(id)

    *

    ERROR at line 1:

    ORA-01408: such column list already indexed

    即使创建非唯一索引也不行:

    SQL> create index idx_test_id on test(id);

    create index idx_test_id on test(id)

    *

    ERROR at line 1:

    ORA-01408: such column list already indexed

     

    那么唯一键约束的情况是怎样的呢?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20),

    4 constraint uk_test unique(id));

     

    Table created.

     

    SQL> select constraint_name, constraint_type from user_constraints;

     

    CONSTRAINT_NAME C

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

    UK_TEST U

     

    查看此时的索引情况:

    SQL> select index_name, index_type, uniqueness, tablespace_name

    2 from user_indexes

    3 where table_owner='SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME

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

    UK_TEST NORMAL UNIQUE USERS

    Oracle同样自动创建了一个同名的唯一索引,而且也不允许再在此列上创建唯一索引或非唯一索引。

     

    我们知道,主键约束要求列值非空(NOT NULL),那么唯一键约束是否也要求非空呢?

    SQL> insert into test values(1, 'Sally');

     

    1 row created.

     

    SQL> insert into test values(null, 'Tony');

     

    1 row created.

     

    SQL> insert into test values(null, 'Jack');

     

    1 row created.

     

    SQL> select * from test;

     

    ID NAME

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

    1 Sally

    Tony

    Jack

    从实验结果来看,唯一键约束并没有非空要求。

     

    接下来我们看看唯一索引对列值的非空要求有什么不同。

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20));

     

    Table created.

     

    SQL> create unique index idx_test_id on test (id);

     

    Index created.

     

    SQL> insert into test values(1, 'Sally');

     

    1 row created.

     

    SQL> insert into test values(null, 'Tony');

     

    1 row created.

     

    SQL> insert into test values(null, 'Jack');

     

    1 row created.

     

    SQL> select * from test;

     

    ID NAME

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

    1 Sally

    Tony

    Jack

    通过实验,我们看出唯一索引与唯一键约束一样对列值非空不做要求。

     

    如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20),

    4 constraint uk_test unique(id));

     

    Table created.

     

    SQL> select index_name, index_type, uniqueness from user_indexes;

     

    INDEX_NAME INDEX_TYPE UNIQUENES

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

    UK_TEST NORMAL UNIQUE

     

    SQL> alter table test disable constraint uk_test;

     

    Table altered.

     

    SQL> select index_name, index_type, uniqueness from user_indexes;

     

    no rows selected

    当主键约束或者唯一键约束失效时,Oracle会删除隐式创建的唯一索引。

     

    如果我们先创建唯一索引,再创建主键或者唯一键约束,情况又会怎样呢?

    SQL> drop table test purge;

     

    Table dropped.

     

    SQL> create table test(

    2 id int,

    3 name varchar2(20));

     

    Table created.

     

    SQL> create unique index idx_test_id on test (id);

     

    Index created.

     

    SQL> select index_name, index_type, uniqueness

    2 from user_indexes

    3 where table_owner = 'SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES

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

    IDX_TEST_ID NORMAL UNIQUE

     

    SQL> alter table test add constraint uk_test unique (id);

     

    Table altered.

     

    SQL> select index_name, index_type, uniqueness

    2 from user_indexes

    3 where table_owner = 'SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES

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

    IDX_TEST_ID NORMAL UNIQUE

     

    SQL> select constraint_name, constraint_type

    2 from user_constraints

    3 where table_name = 'TEST';

     

    CONSTRAINT_NAME C

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

    UK_TEST U

     

    SQL> alter table test disable constraint uk_test;

     

    Table altered.

     

    SQL> select constraint_name, constraint_type, status

    2 from user_constraints

    3 where table_name = 'TEST';

     

    CONSTRAINT_NAME C STATUS

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

    UK_TEST U DISABLED

     

    SQL> select index_name, index_type, uniqueness, status

    2 from user_indexes

    3 where table_owner = 'SCOTT'

    4 and table_name = 'TEST';

     

    INDEX_NAME INDEX_TYPE UNIQUENES STATUS

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

    IDX_TEST_ID NORMAL UNIQUE VALID

     

    实验结果表明,先创建的唯一索引不受约束失效的影响。

     

    总结如下:

    1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;

    2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;

    3)相同字段序列不允许重复创建索引;

    展开全文
  • mysql数据库中对字段的约束里存在主键约束,也存在唯一键约束,这两种约束很容易出现混淆的情况,这里讲一下两个的区别: 主键和唯一键的对比: 约束 保证唯一性 是否为空 一个表中有多少个 是否允许...
  • 唯一约束(Unique Constraint):约束唯一标识数据库表中每条记录,确保表中某一列或者复合列数据没有相同值。 UNIQUE PRIMARY KEY 约束均为列或列集合提供了唯一性保证。PRIMARY KEY 拥有自动定义 ...
  • sql主键和外键的区别

    千次阅读 2015-10-13 23:56:20
    当创建或者更改表时可以通过定义PRIMARY KEY约束来创建主键,一个表只能有一个主键约束,而且主键约束列不能是空值,由于主键约束确保唯一数据,所一经常来定义标识列。 每一个表都必须定义一个主键吗? 我个人...
  • 唯一的区别就是: 前者:不允许有空值 后者:可以有一个空值 对后者实验: [code="sql"] [db2inst@rhel5 ~]$ db2 "create table nnull(aaa varchar(7))" --建表 DB20000I The SQL ...
  • SQLServer中有五种约束,Primary Key约束、Foreign Key约束、Unique约束、Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的创建和使用的方法。 什么是主键? 在数据库中,常常不只是一个表,...
  • wherehaving的区别 Where是一个约束声明,使用Where约束来自数据库的数据,Where是在结果返回之前起作用的,Where中不能使用聚合函数。Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,...
  • 主键: 是约束 唯一性 非空 可以是多个字段组合 一张表只能有一个主键 可以作为外键 ...mysql/sqlserver/oracle 中, 主键和唯一约束都会被自动添加唯一索引 参考: https://www.cnblogs.com/...
  • 主键: 能够唯一表示数据表中每个记录【字段】或者【字段】组合就称为主码(主键)。...唯一约束是用于指定一个或多个列组合值具有惟一性,以防止在列中输入重复值。所以,主键的值对用户而言
  • 主键一定是唯一性索引,唯一性索引并不一定就是主键。 所谓主键就是能够唯一标识表中某一行属性或属性组,一个表只能有一个主键,但可以有多个候选索引。...主键可以保证记录的唯一和主键域非空,数...
  • 1.概念 ·主键:同一张表用于标识各条记录字段,就可以拿来做主键,和人身份证号码一样;...主键和唯一索引都要求值唯一,但是它们还是有区别的: ①.主键是一种约束,唯一索引是一种索引; ②.一张
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别SQL> select * from v$version; BANNER ----...
  • SQL 主键与外键关系

    千次阅读 2018-04-25 10:15:27
    转载:点击打开链接SQL主键和外键的作用:外键取值规则:空值或参照的主键值。(1)插入非空值时,如果主键表中没有这个值,则不能插入。(2)更新时,不能改为...主键、外键索引的区别定义:主键--唯一标识一条记...
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别SQL> select * from v$version; BANNER -------------
  • SQL约束

    2021-03-27 21:12:05
    PRIMARY KEYUNIQUE的区别 PRIMARY KEY是主键,UNIQUE是唯一约束。 UNIQUE 可空,可以在一个表里的一个或多个字段定义;PRIMARY KEY不可空不可重复,在一个表里可以定义联合主键; 简单说:PRIMARY KEY = UNIQUE + ...
  • SQL Server 表变量和临时表的区别 ... 表变量在SQL Server 2000中首次被引入。表变量的具体定义包括列定义,...而在表变量中可以使用的约束包括主键约束唯一约束,NULL约束和CHECK约束(外键约束不能在...
  • 一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别SQL>select * from v$version;   BANNER -----------
  • 文章目录SQL语言之增删改、约束、序列SQL增删改--对表或字段操作约束非空约束默认值约束唯一约束主键约束主键约束和唯一约束的区别外键约束Check约束序列SQL语句增删改--对表中的数据操作INSERT语句UPDATE语句DELETE...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

sql主键约束和唯一约束的区别