数据库中外键的作用以及和主键的区别

本文解释了数据库中主键和外键的概念及其作用,并对比了它们与索引的区别,帮助读者更好地理解如何在实际应用中正确使用这些关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.csdn.NET/tiantian1980/article/details/1603126

外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的“参照完整性”的数据库实现方式。   
    
  外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。   
    例如有两个表   
  A(a,b)   :a为主键,b为外键(来自于B.b)   
  B(b,c,d)   :b为主键    
  如果我把字段b的外键属性去掉,对编程没什么影响。
  如上面,A中的b要么为空,要么是在B的b中存在的值,有外键的时候,数据库会自动帮你检查A的b是否在B的b中存在。

  1、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。   
  2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个企业现有的数据库,里面的参照完整性约束有的是外键描述,有的是用触发器实现,感觉很明显。当然,文档里可能有,但是也可能不全,但是外键就非常明显和直观。   
  3、既然我们可以用触发器或程序完成的这个工作(指参照完整性约束),DBMS已经提供了手段,为什么我们要自己去做?而且我们做的应该说没有RDBMS做得好。实际上,早期的RDBMS并没有外键,现在都有了,我认为数据库厂商增加这个功能是有道理的。从这个角度来说,外键更方便。   
  4、关于方便,根据我带项目的情况来看,程序员确实有反映,主要是在调试时输入数据麻烦:如果数据可以违反参照完整性,那么就是说参照完整性本身就不对名誉业务冲突,此时也不应该用触发期货程序实现;否则,说明数据是错误的,根本就不应该进入数据库!而且,这也应该是测试系统的一个内容:阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。

最后说一下,建键几个原则:

1、 为关联字段创建外键。
2、 所有的键都必须唯一。
3、避免使用复合键。
4、外键总是关联唯一的键字段。 


http://www.cnblogs.com/ywb-lv/archive/2012/03/12/2391860.html

定义主键和外键主要是为了维护关系数据库的完整性,总结一下:

一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。


二、主键、外键和索引的区别

定义:

 主键--唯一标识一条记录,不能有重复的,不允许为空

 外键--表的外键是另一表的主键外键可以有重复的可以是空值

 索引--该字段没有重复值,但可以有一个空值


作用:

 主键--用来保证数据完整性

 外键--用来和其他表建立联系用的

 索引--是提高查询排序的速度


个数:

 主键--主键只能有一个

 外键--一个表可以有多个外键

 索引--一个表可以有多个唯一索引

### 数据库中外主键的概念及用法 #### 主键 (Primary Key) 主键是一个或一组字段,其值能够唯一地标识数据库表中的每一条记录。它的主要特性包括: - **唯一性**:主键的值必须是唯一的,不能存在重复值。 - **非空性**:主键字段的值不能为空(NULL)。 - **单个性**:每个表只能有一个主键,但这个主键可以由一个字段或多字段组合而成(称为复合主键)。 主键的主要作用在于确保数据的完整性以及提供一种快速查找引用特定记录的方式。它是其他表中外关联的基础[^3]。 在 SQL 中创建主键的方法如下所示: ```sql CREATE TABLE example_table ( id INT PRIMARY KEY, name VARCHAR(100), age INT ); ``` #### (Foreign Key) 是指向另一个表中主键的字段,用于维护两个表之间的关系并确保数据一致性。作用主要是通过主键之间的关系,使得不同表中的数据更好地关联起来。具体来说,如果 A 表的一个字段对应 B 表的主键,则该字段可作为 A 表的[^2]。 在的帮助下,可以通过参照完整性约束防止出现数据不一致的情况。例如,在删除或修改父表(包含主键的表)中的记录时,子表(包含的表)的相关记录也会受到相应的影响。 以下是创建带有约束的表的例子: ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, FOREIGN KEY (customer_id) REFERENCES customers(id) ); ``` 在这个例子中,`orders` 表中的 `customer_id` 字段作为一个,指向 `customers` 表中的 `id` 字段。 #### 主键区别 尽管主键都参与了数据库设计中的重要部分,但两者有着显著的不同之处: | 特性 | 主键 | | |--------------|----------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| | 唯一性 | 必须具有唯一性 | 不一定需要唯一性 | | 非空性 | 不能为空 | 可以为 NULL | | 数量限制 | 每个表只能有一个主键 | 一个表可以有多个 | | 关联功能 | 是本表内部的关标识符 | 用于与其他表建立联系 | 主键通常用来保证当前表内的数据完整性,而则更多关注于跨表间的数据一致性[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值