SQL FOREIGN KEY 约束- 保障表之间关系完整性的关键规则
SQL FOREIGN KEY 约束
SQL FOREIGN KEY 约束用于防止破坏表之间关系的操作。FOREIGN KEY 是一张表中的字段(或字段集合),它引用另一张表中的主键。具有外键的表称为子表,具有主键的表称为被引用表或父表。
以下是两个表的例子:
Persons 表
PersonID LastName FirstName Age
1 Hansen Ola 30
2 Svendson Tove 23
3 Pettersen Kari 20
Orders 表
OrderID OrderNumber PersonID
1 77895 3
2 44678 3
3 22456 2
4 24562 1
注意,"Orders" 表中的 "PersonID" 列指向 "Persons" 表中的 "PersonID" 列。"Persons" 表中的 "PersonID" 列是 "Persons" 表中的主键。"Orders" 表中的 "PersonID" 列是 "Orders" 表中的外键。
FOREIGN KEY 约束防止将无效数据插入到外键列中,因为它必须是父表中包含的值之一。
在 CREATE TABLE 时使用 SQL FOREIGN KEY
以下 SQL 在创建 "Orders" 表时在 "PersonID" 列上创建了一个 FOREIGN KEY:
对于 MySQL:
CREATE TABLE Orders (
OrderID int NOT NULL,
OrderNumber int NOT NULL,
PersonID int,
PRIMARY KEY (OrderID),
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
);
对于 SQL Server / Oracle / MS Access:
CREATE TABLE Orders (
OrderID int NOT NULL PRIMARY KEY,
OrderNumber int NOT NULL,
PersonID int FOREIGN KEY REFERENCES Persons(PersonID)
);
要允许对 FOREIGN KEY 约束进行命名,并在多列上定义 FOREIGN KEY 约束,请使用以下 SQL 语法:
对于 MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders (
OrderID int NOT NULL,
OrderNumber int NOT NULL,
PersonID int,
PRIMARY KEY (OrderID),
CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID)
REFERENCES Persons(PersonID)
);
在 ALTER TABLE 时使用 SQL FOREIGN KEY
要在表已经创建的情况下在 "PersonID" 列上创建 FOREIGN KEY 约束,请使用以下 SQL:
对于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
要允许对 FOREIGN KEY 约束进行命名,并在多列上定义 FOREIGN KEY 约束,请使用以下 SQL 语法:
对于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD CONSTRAINT FK_PersonOrder
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
删除 FOREIGN KEY 约束
要删除 FOREIGN KEY 约束,请使用以下 SQL:
对于 MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY FK_PersonOrder;
对于 SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT FK_PersonOrder;
通过这些 SQL 语句,您可以在数据库中定义和管理 FOREIGN KEY 约束,以确保表之间的关系得到维护。
SQL CHECK 约束
SQL CHECK 约束用于限制可以放入列中的值范围。如果在列上定义了 CHECK 约束,它将仅允许为该列指定某些值。如果在表上定义了 CHECK 约束,它可以基于行中其他列的值来限制某些列中的值。
在 CREATE TABLE 时使用 SQL CHECK
以下 SQL 在创建 "Persons" 表时在 "Age" 列上创建了一个 CHECK 约束。CHECK 约束确保一个人的年龄必须是 18 岁或以上:
对于 MySQL:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
CHECK (Age>=18)
);
对于 SQL Server / Oracle / MS Access:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int CHECK (Age>=18)
);
要允许对 CHECK 约束进行命名,并在多列上定义 CHECK 约束,请使用以下 SQL 语法:
对于 MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
City varchar(255),
CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes')
);
在 ALTER TABLE 时使用 SQL CHECK
要在表已经创建的情况下在 "Age" 列上创建 CHECK 约束,请使用以下 SQL:
对于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CHECK (Age>=18);
要允许对 CHECK 约束进行命名,并在多列上定义 CHECK 约束,请使用以下 SQL 语法:
对于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City='Sandnes');
删除 CHECK 约束
要删除 CHECK 约束,请使用以下 SQL:
对于 SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT CHK_PersonAge;
对于 MySQL:
ALTER TABLE Persons
DROP CHECK CHK_PersonAge;
通过这些 SQL 语句,您可以在数据库中定义和管理 CHECK 约束,以确保列中的值满足指定的条件。
SQL DEFAULT 约束
SQL DEFAULT 约束用于为列设置默认值。如果没有指定其他值,将在所有新记录中添加默认值。
在 CREATE TABLE 时使用 SQL DEFAULT
以下 SQL 在创建 "Persons" 表时为 "City" 列设置了 DEFAULT 值:
对于 MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
City varchar(255) DEFAULT 'Sandnes'
);
DEFAULT 约束还可以用于通过使用诸如 GETDATE() 之类的函数插入系统值:
CREATE TABLE Orders (
ID int NOT NULL,
OrderNumber int NOT NULL,
OrderDate date DEFAULT GETDATE()
);
在 ALTER TABLE 时使用 SQL DEFAULT
要在表已经创建的情况下在 "City" 列上创建 DEFAULT 约束,请使用以下 SQL:
对于 MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'Sandnes';
对于 SQL Server:
ALTER TABLE Persons
ADD CONSTRAINT df_City
DEFAULT 'Sandnes' FOR City;
对于 MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'Sandnes';
对于 Oracle:
ALTER TABLE Persons
MODIFY City DEFAULT 'Sandnes';
删除 DEFAULT 约束
要删除 DEFAULT 约束,请使用以下 SQL:
对于 MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT;
对于 SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;
对于 SQL Server:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;
通过这些 SQL 语句,您可以在数据库中为列设置默认值,确保在插入新记录时,如果未提供值,将使用指定的默认值。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎 点赞、收藏、关注
SQL FOREIGN KEY 约束- 保障表之间关系完整性的关键规则的更多相关文章
- SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束
SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主 ...
- SQL FOREIGN KEY 约束
SQL FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. 让我们通过一个例子来解释外键.请看下面两个表: "Persons&quo ...
- SQL-W3School-高级:SQL FOREIGN KEY 约束
ylbtech-SQL-W3School-高级:SQL FOREIGN KEY 约束 1.返回顶部 1. SQL FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 P ...
- 更改具有Foreign key约束的表
1.Foreign key 说明: foreign key(外键) 建立起了表与表之间的约束关系,让表与表之间的数据更具有完整性和关联性.设想,有两张表A.B,A表中保存了许多电脑制造商的信息,比如联 ...
- SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- sqlserver truncate清空表时候,无法删除 'B表',因为该表正由一个 FOREIGN KEY 约束引用。
外键: 查询:select object_name(a.parent_object_id) 'tables' from sys.foreign_keys a where a.referenced_ ...
- SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则 1.外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列. 2.如果在 FOREIGN KEY 约束的列中输入非 NU ...
- SQLServer 中有五种约束, Primary Key 约束、 Foreign Key 约束、 Unique 约束、 Default 约束和 Check 约束
一直在关注软件设计方面,数据库方面就忽略了很多,最近在设计数据库时遇到了一些小麻烦,主要是数据库中约束和性能调优方面的应用,以前在学习 Sql Server 2000,还有后来的 Sql Server ...
- 删除提示 FOREIGN KEY 约束引用”
有时想删除某个表时,提示“无法删除对象 'Orders',因为该对象正由一个 FOREIGN KEY 约束引用”,原因很简单不要急躁,它被其它表的外键引用了,所以无法删除,在此只需先找到哪些表的外键引 ...
- SQLServer之修改FOREIGN KEY约束
使用SSMS数据库管理工具修改FOREIGN KEY约束 1.连接数据库,选择数据表->右键点击->选择设计(或者展开键,选择要修改的外键,右键点击,选择修改,后面修改步骤相同). 2.在 ...
随机推荐
- 第一篇博客——MarkDown语法
Markdown学习 标题 三级标提 四级标题 字体 Hello World ! 两个星号加粗 Hello World ! 一个星号斜体 Hello World ! Hello World ! 两个波 ...
- 如何实现十亿级离线 CSV 导入 Nebula Graph
本文首发于 Nebula Graph Community 公众号 本次实践是基于业务需求及后续扩展,通过技术选型确定了 Nebula Graph 图数据库,首先需要验证 Nebula Graph 数据 ...
- PlatformIO+esp32+添加自己的库(.c.h文件)
什么都放main.c的话,很有可能堆积成屎山,所以我想给分开写,每个功能有自己的.c..h文件. 在lib下新建文件夹,例如led,再在里面分别建led.c.led.h; 写好内容后再main ...
- CodeCraft-22 and Codeforces Round 795 (Div. 2)C. Sum of Substrings(分类讨论、贪心)
感觉分类讨论的能有点弱.遇到复杂一点的分类讨论的题目,代码就写的巨长. 首先观察到处在中间位置的1对答案的贡献是11,具体在中间哪个位置是没有关系的. 只有两端的两个位置是比较特殊的 \(1位置处的1 ...
- dos-基础用法
DOS(磁盘操作系统)是一个早期的基于命令行的操作系统,尽管现代操作系统已经发展为图形用户界面(GUI),但是了解和掌握一些基本的DOS命令仍然非常有用,尤其是在处理批处理脚本.网络管理或者在没有图形 ...
- 使用 Docker 部署 MrDoc 在线文档管理系统
1)MrDoc 介绍 MrDoc 简介 MrDoc 觅思文档:https://mrdoc.pro/ MrDoc 使用手册:https://doc.mrdoc.pro/p/user-guide/ MrD ...
- Djiango视图层和模型层
Djiango 使用教程 目录 Djiango 使用教程 一. 视图层 1.1 HttpResponse,render,redirect 1.2 JsonResponse 1.3 form表单上传文件 ...
- 本地锁 & 分布式锁
引子: 解决缓存击穿问题 synchronized (this){代码块} public synchronized Map<String,List<Catelog2Vo>> g ...
- Review Book for GEE(Graduate Entrance Examination)
English is made up of phrases and idioms, in the case of both written and spoken usage. When learnin ...
- Java/Kotlin 实现控制台输出日志保存到文件
原文:Java/Kotlin 实现控制台输出日志保存到文件 | Stars-One的杂货小窝 之前开发的几款软件,用户用着的过程中,偶尔会存在报错问题,想保留一份日志出来,之后可由用户发过来,进行问题 ...