我是根据这个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版本低,我就不给你们演示了。
今天就写到这里了,我下午还得实施部署项目呢。一起加油吧。