sql学习教程(五)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39476989/article/details/102697236

我是根据这个https://www.runoob.com/sql/sql-foreignkey.html来学习的,大家也可以参考,我是来根据这个网站做笔记的。

我来了,迟了一天,昨天有一丢丢的没有时间。好吧,时间就像海绵里面的水,挤挤总会有的。别放弃做笔记哈。加油。

SQL FOREIGN KEY 约束

一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。

让我们通过一个实例来解释外键。请看下面两个表:

“Persons” 表:

在这里插入图片描述
在这里插入图片描述
请注意,“Orders” 表中的 “P_Id” 列指向 “Persons” 表中的 “P_Id” 列。

“Persons” 表中的 “P_Id” 列是 “Persons” 表中的 PRIMARY KEY。

“Orders” 表中的 “P_Id” 列是 “Orders” 表中的 FOREIGN KEY。

FOREIGN KEY 约束用于预防破坏表之间连接的行为。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

总结:
这个好说,外键就是为了防止脏数据(明明不存在的数据等),举个例子,如上有两张表,一张用户表,一张订单表,用户有编号1-5,那么订单里的用户编号就不能有1-5以外的数字。为了防止这个情况的发生,所以就有了外键,订单表的用户编号的外键是用户表的用户编号。设置了外键,那么当我给订单表插数据时,假设我给了不对的用户编号,是插不进去数据的,而且会提示你是因为外键的原因。

CREATE TABLE 时的 SQL FOREIGN KEY 约束
下面的 SQL 在 “Orders” 表创建时在 “P_Id” 列上创建 FOREIGN KEY 约束:

你得先建立persons表啊,上次建过了,我的电脑重置了,所以没有,我得重新建表。
MySQL:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)

在这里插入图片描述

如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)

ps:我还没有遇到过定义多个列的 FOREIGN KEY 约束呢,照道理来说,应该是改这个地方,我先不考虑这么多了,我都没有遇到这种情况过。在这里插入图片描述
ALTER TABLE 时的 SQL FOREIGN KEY 约束

这边就是建表的时候没有考虑外键,建完表再建外键,就可以采用这种方式。

当 “Orders” 表已被创建时,如需在 “P_Id” 列创建 FOREIGN KEY 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

撤销 FOREIGN KEY 约束
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:

MySQL:

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

SQL Server / Oracle / MS Access:

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders

!!! 我们第一次不就建了外键了嘛,而且也没有取名字,系统会自动取名

你得使用show create table 语法如下图:查看一下表的外键名称。
在这里插入图片描述
然后再进行删除外键操作
ALTER TABLE Orders
DROP FOREIGN KEY orders_ibfk_1;
在这里插入图片描述
成功!!

SQL CHECK 约束

CHECK 约束用于限制列中的值的范围。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
CREATE TABLE 时的 SQL CHECK 约束
下面的 SQL 在 “Persons” 表创建时在 “P_Id” 列上创建 CHECK 约束。
CHECK 约束规定 “P_Id” 列必须只包含大于 0 的整数。

MySQL:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)

我有个问题这是啥意思

CONSTRAINT chk_Person CHECK (P_Id>0 AND City=‘Sandnes’)
我有两个理解 1,插入的数据只能是P_Id>0并且City必须为’Sandnes’
理解2,插入的数据当City=‘Sandnes’ 时P_Id>0。

所以这样验证:
验证1:city插入一个别的城市如果成功了,那么,这个理解1不攻自破。

在这里插入图片描述
那么理解2应该是正确的,我们来验证一下,当城市为Sandnes,P_Id=0插入不进去就对了。
awsl,都成功了,我的天
在这里插入图片描述
此图片来源:https://www.cnblogs.com/shishibuwan/p/10862404.html

我在网上搜到了上面的话,我真的是无能为力啊。我们公司用的是低版本的mysql5.7的,所以你们可以用新版本的,就自己试试吧。

撤销 CHECK 约束

如需撤销 CHECK 约束,请使用下面的 SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

ALTER TABLE Persons
DROP CHECK chk_Person

ps:我想笑,低版本的mysql可以加约束,但是这个约束没有任何约束效果在,而且删除约束呢,删除不掉会报错。因为我实习的公司要求的mysql版本低,我就不给你们演示了。

今天就写到这里了,我下午还得实施部署项目呢。一起加油吧。

猜你喜欢

转载自blog.csdn.net/qq_39476989/article/details/102697236
今日推荐