关系型数据库中的主键和外键

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 关系型数据库中的主键和外键

关系型数据库中的主键和外键


在关系型数据库中,主键和外键是两个非常重要的概念。主键用于唯一地标识一条记录,而外键则用于建立表与表之间的关联关系。本文将会详细介绍主键和外键的概念、作用以及应用场景,并提供代码示例来说明它们在实际中的应用。


image.png


主键


在关系型数据库中,每个表都必须有一个主键。主键是一种用来唯一地标识一条记录的字段或字段组合。主键的值不能重复,也不能为 NULL。主键可以是表中任意一个字段,但通常会选择一个具有唯一性的字段作为主键。例如,在一个用户表中,可以选择用户的 ID 字段作为主键。


主键的作用是确保表中的每条记录都可以被唯一地标识。这在数据查询、修改和删除等操作中非常有用。如果没有主键,就无法准确地确定一条记录,这样就会影响数据库的数据完整性和一致性。


下面是一个示例表格,其中包含了主键的定义:


| User ID | Username | Email          | Phone          |
| ------- | -------- | --------------| -------------- |
| 1       | Alice    | alice@abc.com  | 123-456-7890   |
| 2       | Bob      | bob@abc.com    | 234-567-8901   |
| 3       | Carol    | carol@abc.com  | 345-678-9012   |

在这个示例中,User ID 是主键。


外键


在关系型数据库中,外键用于建立表与表之间的关联关系。外键是一个字段或字段组合,它与另一个表的主键相对应。外键用于确保表之间的数据完整性和一致性。当一个表的字段被作为外键引用到另一个表的主键时,这两个表之间就建立了关联关系。


外键的作用可以通过一个示例来说明。假设有两个表,一个是用户表,一个是订单表。用户表中有一个名为 User ID 的字段作为主键,订单表中有一个名为 User ID 的字段作为外键,用于与用户表建立关联关系。这样,每个订单都可以与一个用户对应,而且每个订单的 User ID 必须在用户表中存在,否则就无法插入该订单。


下面是一个示例表格,其中包含了外键的定义:


| Order ID | User ID | Order Date |
| --------| ------- | ---------- |
| 1       | 2       | 2022-01-01 |
| 2       | 1       | 2022-01-02 |
| 3       | 3       | 2022-01-03 |

在这个示例中,User ID 是外键。


应用场景


主键和外键在关系型数据库设计中都非常重要,它们可以确保数据的完整性和一致性。下面是一些主键和外键的应用场景:


主键


  1. 用户表中的 User ID 字段可以作为主键,确保每个用户是唯一的。
  2. 商品表中的 SKU 字段可以作为主键,确保每个商品是唯一的。
  3. 订单表中的 Order ID 字段可以作为主键,确保每个订单是唯一的。


外键


  1. 订单表中的 User ID 字段可以作为外键,与用户表建立关联关系,确保每个订单都对应一个用户。
  2. 订单详情表中的 Order ID 字段可以作为外键,与订单表建立关联关系,确保每个订单详情都对应一个订单。
  3. 购物车表中的 SKU 字段可以作为外键,与商品表建立关联关系,确保购物车中的商品都是有效的。


代码示例


下面是一个基于 Python 和 SQLite 的代码示例,用于说明主键和外键在实际中的应用。


首先,我们需要创建一个用户表和一个订单表:


import sqlite3
conn = sqlite3.connect('example.db')
# 创建用户表
conn.execute('''CREATE TABLE users
             (id INTEGER PRIMARY KEY,
              username TEXT NOT NULL,
              email TEXT NOT NULL,
              phone TEXT NOT NULL)''')
# 创建订单表
conn.execute('''CREATE TABLE orders
             (id INTEGER PRIMARY KEY,
              user_id INTEGER NOT NULL,
              order_date TEXT NOT NULL,
              FOREIGN KEY (user_id) REFERENCES users(id))''')

在这个示例中,我们使用 SQLite 数据库,并创建了一个 users 表和一个 orders 表。users 表中的 id 字段被定义为主键,orders 表中的 user_id 字段被定义为外键,与 users 表中的 id 字段建立了关联关系。


接下来,我们可以向用户表中插入一些数据:


# 插入用户数据
conn.execute("INSERT INTO users (username, email, phone) VALUES (?, ?, ?)",
             ('Alice', 'alice@example.com', '123-456-7890'))
conn.execute("INSERT INTO users (username, email, phone) VALUES (?, ?, ?)",
             ('Bob', 'bob@example.com', '234-567-8901'))
conn.execute("INSERT INTO users (username, email, phone) VALUES (?, ?, ?)",
             ('Carol', 'carol@example.com', '345-678-9012'))

然后,我们可以向订单表中插入一些数据:


# 插入订单数据
conn.execute("INSERT INTO orders (user_id, order_date) VALUES (?, ?)",
             (2, '2022-01-01'))
conn.execute("INSERT INTO orders (user_id, order_date) VALUES (?, ?)",
             (1, '2022-01-02'))
conn.execute("INSERT INTO orders (user_id, order_date) VALUES (?, ?)",
             (3, '2022-01-03'))

在这个示例中,我们向订单表中插入了一些数据,其中 user_id 字段指向了用户表中的对应数据。由于 user_id 字段被定义为外键,并且与 users 表中的 id 字段建立了关联关系,因此当插入数据时,如果 user_id 字段的值不在 users 表中存在,就会抛出错误。


总结


在关系型数据库中,主键和外键是非常重要的概念。主键用于唯一地标识一条记录,而外键用于建立表与表之间的关联关系。主键和外键可以确保数据的完整性和一致性,在数据库设计和开发中应用广泛。本文通过示例代码的方式,介绍了主键和外键在实际中的应用场景,希望对读者有所帮助。


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
2月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
3月前
|
安全 数据管理 关系型数据库
深入理解数据库主键
【8月更文挑战第31天】
77 0
|
4月前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之主键为NULL是什么导致的
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库——SQL优化(1/3)-介绍、插入数据、主键优化
MySQL数据库——SQL优化(1/3)-介绍、插入数据、主键优化
287 1
|
5月前
|
SQL 关系型数据库 Java
有大批量的数据导入到数据库,规则是数据库有相应主键的就update没有就insert怎么做效率快
有大批量的数据导入到数据库,规则是数据库有相应主键的就update没有就insert怎么做效率快
105 1
|
5月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之源实例无主键表校验出现报错,该怎么办
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
114 0
|
5月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之如何解决源实例无主键表校验未通过的问题
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
运维 关系型数据库 分布式数据库
PolarDB产品使用问题之如果某些表没有主键是否可以迁移
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
算法 关系型数据库 数据库
|
6月前
|
关系型数据库 数据库
关系型数据库表结构设计的主键的简单性
【5月更文挑战第16天】关系型数据库表结构设计的主键的简单性
56 2