主键与唯一键区别

【注】 转载原文地址:http://blog.sina.com.cn/s/blog_54eeb5d9010005e1.html
1、一个表中可以有多个唯一索引,但是只能有一个主键
2、主键一定是唯一性索引,唯一性索引并不一定就是主键
主键不允许为空,唯一键允许为空,空值不受唯一约束,也就是说可以有多个空值。
注:可以多列组合成一个唯一索引或者一个主键,即组合索引或组合主键
 
代码:


SQLcreate table t (a number(5not nullb number(5)); 

Table created 

SQLalter table t add constraint pk_t primary key (ausing indexTable altered 

SQLcreate unique index idx_t_b on t (b); 

Index created 

SQLinsert into t values (11); 

1 row inserted 

SQLinsert into t values (21); 

insert into t values (21ORA-00001unique constraint (DEMO.IDX_T_Bviolated 

SQLinsert into t values (2null); 

1 row inserted 

SQLinsert into t values (3null); 

1 row inserted 

SQLinsert into t values (4null); 

1 row inserted 

SQLinsert into t values (42); 

insert into t values (42ORA-00001unique constraint (DEMO.PK_Tviolated 

SQLinsert into t values (null2); 

insert into t values (null2ORA-01400cannot insert NULL into ("DEMO"."T"."A"SQLselect from t; 

          ------ ------ 
          1 
     2 
     3 
     4
<think>好的,用户想了解唯一键主键在数据库设计中的区别。我需要先回忆一下相关知识,然后结合提供的引用内容来组织回答。首先,主键唯一键都是用来保证数据唯一性的约束。根据引用1,主键是被选中的唯一标识,而唯一键则是其他需要唯一性的列。主键不能有NULL值,而唯一键允许NULL,这点引用3里提到过。比如员工的电子邮件可以是唯一键,但可能有空值。然后,主键一个表只能有一个,而唯一键可以有多个,这也是区别之一。引用2里提到主键是用户选的一个候选键,而候选键是不含多余属性的超键。主键用于外键关联,确保实体完整性,而唯一键更多是业务上的唯一需求,比如邮件或者身份证号。 还要注意索引方面,主键会自动创建聚集索引,而唯一键是非聚集的,这可能影响查询性能。引用4讨论主键的设计策略,比如自增ID或GUID,但唯一键的设计可能更灵活,不需要考虑分布式的问题。应用场景方面,主键用于唯一标识记录,是关系的核心,而唯一键处理业务上的唯一约束,比如防止重复邮箱注册。需要举例说明,比如员工表的例子,这样用户更容易理解。 最后,要确保回答结构清晰,分点列出区别,并引用相关文献。可能还需要生成相关问题,比如设计原则或索引影响,帮助用户深入理解。</think>### 唯一键主键区别 在数据库设计中,主键(Primary Key)唯一键(Unique Key)都是用于保证数据唯一性的约束,但二者在功能应用场景上有显著差异。以下是具体区别: #### 1. **唯一性约束的强制性** - **主键**:必须唯一且**不允许NULL值**。主键的唯一性是强制性的,若插入重复值或空值会导致操作失败[^1][^3]。 - **唯一键**:必须唯一但**允许NULL值**(具体取决于数据库实现,如MySQL允许单个NULL值,而多个NULL值可能被视为唯一)[^3]。 #### 2. **数量限制** - **主键**:一个表只能有一个主键(可以是单列或多列组合)[^2][^3]。 - **唯一键**:一个表可以有多个唯一键[^1][^3]。 #### 3. **功能定位** - **主键**:核心作用是**唯一标识表中的每一条记录**,并作为外键关联的基础,确保数据的实体完整性[^2][^3]。 - **唯一键**:用于保证**业务层面的唯一性需求**,例如防止重复的邮箱、身份证号等,但不用于标识记录本身[^1][^3]。 #### 4. **索引类型** - **主键**:默认创建**聚集索引**(Clustered Index),直接影响数据的物理存储顺序[^2][^4]。 - **唯一键**:默认创建**非聚集索引**(Non-clustered Index),仅用于加速查询,不影响物理存储[^2]。 #### 5. **应用场景** - **主键**:适用于需要严格唯一标识且无空值的场景,例如用户表的用户ID、订单表的订单号[^4]。 - **唯一键**:适用于业务需要唯一但允许部分数据缺失的场景,例如员工表的邮箱字段(允许未填写,但填写后必须唯一)[^3]。 #### 6. **设计原则** - 主键应尽量简短且稳定(如自增整数或雪花算法生成的ID),避免使用业务含义易变的字段[^4]。 - 唯一键可根据业务需求灵活定义,例如对用户手机号、身份证号等字段添加唯一约束[^1][^3]。 --- ### 示例场景 假设设计一个“员工表”: - **主键**:`employee_id`(自增数字),确保每条记录的唯一标识。 - **唯一键**:`email`(允许NULL,但非空时需唯一)、`national_id`(身份证号,强制唯一且非空)。 --- ### 总结 | **对比维度** | **主键** | **唯一键** | |--------------------|-----------------------------|-----------------------------| | 唯一性 | 强制唯一且非空 | 强制唯一但允许NULL | | 数量限制 | 一个表仅一个 | 可定义多个 | | 索引类型 | 聚集索引 | 非聚集索引 | | 主要用途 | 标识记录、外键关联 | 业务唯一性约束 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值