精华内容
下载资源
问答
  • 唯一键约束和主键约束的区别
    2021-12-09 21:23:48

    主键约束 primary key

    主键约束时唯一的表示表中的每一条记录
    主键列上不存在重复的值
    主键可做外键   
    

    唯一性约束 unique

    一个表上可以放置多个唯一性约束
    表中任意的两行 指定列 都不允许有相同的值  允许空(null)
    

    相同点
    他们都属于实体完整性约束

    不同点
    唯一性约束所在的列 允许空值 但是主键约束所在的列不允许空值
    可以把唯一性约束放在一个或者多个列上 这些列或者列的组合必须是唯一性的 唯一性约束所在的列并不是表的主键列
    唯一性约束强制在指定的列上创建一个唯一性索引 在默认情况下 创建唯一性的非聚簇索引 但是 也可以指定所创建的索引是聚簇索引

    其中的聚簇索引 不是一种索引类型 而是一种数据存储方式
    其中InnoDB主键适用聚簇索引

        被索引的列必须是主键列  只有主键才能适用  一张表只有一个聚簇索引
    

    非主键适用 辅助索引 二次索引

    MyISAM存储引擎 主键 非主键 非聚簇索引

    	其中不是直接保存数据  而是数据的地址(指针) 唯一的区别就是主索引要求key是唯一的  而辅助索引的key可以重复
    

    数据库的完整性

    • 正确性
    • 相容性
    • 维护完整性

    实体完整性
    参照完整性
    用户自定义完整性

    更多相关内容
  • 首先说明一点,主键又称主键约束,它也是一种约束,看下它和唯一约束的创建语法: alter table Person add constraint PK_Id primary key (Id) alter table Person add constraint UQ_Name unique (Name) 主键...
  • 主键对表实施完整性约束。表中只允许使用一个主键主键不接受任何重复值空值。表中的主键值很少更改,因此在选择主键是需要小心,要选择很少发生更改的地方。一个表的主键可以被另一个表的外键引用。 为了更好地...
  • 主键约束和唯一性约束的区别

    千次阅读 2021-02-11 02:46:06
    1.主键约束(PRIMARYKEY)1)主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主。2)是不可能(或很难)更新.3)主键列上没有任何两行具有相同值(即重复值),不允许空(NULL).4)主健可作外健,唯一索引不可;...

    1.主键约束(PRIMARY KEY)

    1) 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键。

    2) 是不可能(或很难)更新.

    3) 主键列上没有任何两行具有相同值(即重复值),不允许空(NULL).

    4) 主健可作外健,唯一索引不可;

    2.唯一性约束(UNIQUE)

    1) 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束.

    2) 只要唯一就可以更新.

    3) 即表中任意两行在  指定列上都不允许有相同的值,允许空(NULL).

    4) 一个表上可以放置多个唯一性约束

    3.唯一索引(INDEX)

    创建唯一索引可以确保任何生成重复键值的尝试都会失败。

    唯一性约束和主键约束的区别:

    (1).唯一性约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。

    (2).在创建唯一性约束和主键约束时可以创建聚集索引和非聚集索引,但在 默认情况下主键约束产生聚集索引,而唯一性约束产生非聚集索引

    约束和索引, 前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。

    唯一性约束与唯一索引有所不同:

    (1).创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。

    (2).创建唯一索引只会创建一个唯一索引,不会创建Constraint。

    也就是说其实唯一约束是通过创建唯一索引来实现的。

    在删除时这两者也有一定的区别:

    删除唯一约束时可以只删除约束而不删除对应的索引,所以对应的列还是必须唯一的,

    而删除了唯一索引的话就可以插入不唯一的值。

    展开全文
  • 索引和键的混淆通常是由于数据库使用索引来实施完整性约束。 接下来我们看看数一般,我们看到术语“索引””交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,纯粹是一个逻辑概念。...

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

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

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

    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_TESTNORMAL UNIQUEUSERS

    此时,如果我们再试图在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_TESTNORMAL UNIQUEUSERS

    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)相同字段序列不允许重复创建索引;

    本文原创发布php中文网,转载请注明出处,感谢您的尊重!

    展开全文
  • 一般,我们看到术语“索引”“键”交换使用,但实际上这两个是不同的。...接下来我们看看数据库中的主键约束唯一键约束和唯一索引的区别。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_TESTNORMAL UNIQUEUSERS

    此时,如果我们再试图在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_TESTNORMAL UNIQUEUSERS

    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)相同字段序列不允许重复创建索引;

    ( 4 )创建唯一索引保证了往表中插入重复索引列值的操作都会失败。如果一个单独的sql语句试图往表中插入包含重复索引列值的数据行,sql

    server将不会插入以上所有行。例如,当一个insert操作试图把从表A中取出的20行插入到表B,而其中的10行跟索引列值重复的话,默认情况下以上20行都不会被插入。然而,如果把索引对应的

    “忽略重复键”开关打开的话,包含重复数值的行不会被插入,而非重复数值行会被插入。也就是说,其中的10行会被插入。

    约束则没有这一开关,因此定义了一个约束之后,只要有与定义列重复值的行,插入都将被拒绝

    展开全文
  • 主键约束和唯一约束的区别

    千次阅读 2017-11-14 09:30:26
    1.主键约束(PRIMARY KEY) 1) 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主。...1) 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表
  • 唯一约束和主键约束区别

    万次阅读 2017-10-18 23:42:00
    主键又称主键约束,它也是一种约束,看下它和唯一约束的创建语法: alter table Person add constraint PK_Id primary key (Id) alter table Person add constraint UQ_Name unique (Name) 主键和唯一...
  • 主键(primary key):用户选作元组标识的一个候选程序主键 比如一个小范围的所有人,没有重名的,考虑以下属性 身份证 姓名 性别 年龄 身份证唯一,所以是一个超 姓名唯一,所以是一个超 (姓名,性别)唯一,...
  • 主键约束和唯一约束的区别 允许的数据不同:主键约束不可以为空,而唯一可以为空 数量上不同:主键只能有一个,而唯一约束可以有无数个 作用上:主键的目的用来保证每一条数据都有且只有一个编号,而唯一约束目的则...
  • 主键约束和唯一约束

    千次阅读 2019-03-07 21:30:59
    主键约束和唯一约束主键约束和唯一约束的区别普通索引和唯一索引Mysql中的索引普通索引(非唯一索引)唯一索引唯一索引主键约束的唯一索引唯一约束的唯一索引创建唯一索引删除主键约束和唯一约束自动创建的唯一索引 ...
  • 主键约束(PRIMARY KEY)和唯一约束(UNIQUE)的区别

    万次阅读 多人点赞 2019-09-09 17:24:22
    1.主键约束(PRIMARY KEY) 主键用于唯一地标识表中的每一条记录,...唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束. 只要唯一就可以更新....
  • Oracle中五种约束类型:唯一性约束、主键约束、外键约束、非空约束、check约束
  • MySQL唯一键和主键

    2021-01-19 18:30:52
    用下面的命令创建一个表:CREATE TABLE people (age INT NOT NULL,name CHAR(20) NOT ...我们可以使用unique key约束强制一个列只有唯一的值:CREATE TABLE people (age INT NOT NULL,name CHAR(20) NOT NULL UNIQUE...
  • 主键 唯一键(唯一约束

    千次阅读 2017-04-25 14:48:42
    唯一键,也称(唯一约束),一个表中可以为有多个唯一键并且唯一键的值值可以为NULL,但NULL也不能重复,也就是说只能有一行的值为NULL。它会隐式的创建唯一索引 例: alter table 表名 add constraint 约束
  • SQLServer中有五种约束,Primary Key约束、Foreign Key约束、Unique约束、Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的创建使用的方法。 什么是主键? 在数据库中,常常不只是一个表,...
  • 主键约束、主键自增约束、唯一约束、非空约束、外键约束
  • 主键约束:就是一种约束; 主键字段:该字段上添加了主键约束,这样的字段叫做主键字段; 主键值:主键字段中的每一个值都叫做主键值; 主键的特征:not null + unique(非空且不重复) 主键是每一行的唯一标识,...
  • 主键用唯一索引+主键约束两步骤来创建,可直接变更为唯一索引 唯一索引用普通索引+唯一约束两步骤来创建,可以直接变更为普通索引 主键不同创建方式,不同的ddl变更结果:测试表如下 create table TEST01 ( ...
  • 约束:对表中的数据进行限定,保证数据的正确性、有效性完整性。 非空约束:not null -- 创建表时添加非空约束 CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL ); -- 创建表后添加非空约束 ALTER TABLE ...
  • 1.主键约束 (Primary Key) mysql> select * from teacher ; 用来做演示的表格 +-----------+-------------+------------+ | teacherid | teachername | teacherage | +-----------+-------------+------------+ |...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,160
精华内容 20,064
关键字:

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