MySQL约束篇

约束分类:

 值得注意的是,约束是作用与字段上的,对字段进行的一个约束。因此,我们可以在创建或者修改一个表的时候进行约束。

 接下来,我们用一个示例来演示约束:

根据需求,我们可以用下面的SQL语句来创建符合该要求的表:

create table user(
    id int primary key auto_increment comment 'id',
    name varchar(10) not null unique comment '姓名',
    age int check(age>0 && age<120) comment '年龄',
    status char(1) default'1' comment '状态',
    gender char(1) comment'性别'
)comment '用户表';

 这样就通过SQL创建好符合条件的表了。

在这里我们给出通过DG图形化界面来给表增加约束的方法:

1.

 2.

我们为表中插入十条数据:

INSERT INTO user(name, age, status, gender) VALUES
    ('张三', 20, '1', 'M'),
    ('李四', 25, '1', 'M'),
    ('王五', 30, '1', 'M'),
    ('赵六', 28, '1', 'F'),
    ('钱七', 22, '1', 'F'),
    ('孙八', 40, '1', 'M'),
    ('周九', 18, '1', 'F'),
    ('吴十', 35, '1', 'M'),
    ('郑一', 27, '1', 'F'),
    ('秦二', 32, '1', 'M');

 由于id被设为了主键且自动增长,所以无需设置自动增长。



接下来我们来介绍外键

我们来看一个例子,以便于我们更好的理解外键:

这两张表目前只是存在逻辑关系,但是并不存在数据库层面上的关系。好比一个小孩长得像一个男人,他俩目前只是在逻辑上可能是父子,但是没有亲子鉴定,就不能将他俩建立真正的关系。

所以这时,我们应该通过外键来建立真正的联系:

我们先创建两个表,一个叫做员工表,一个叫做部门表:

员工表:

create table emp(
    id int primary key auto_increment comment 'id',
    name varchar(10) not null unique comment '姓名',
    age int check(age>0 && age<120) comment '年龄',
    gender char(1) comment'性别',
    empno varchar(12) comment '工作部门'
)comment '雇员表';

 部门表:

create table dep(
    id varchar(12) primary key comment '部门id',
    name char(23) not null unique comment '部门名称'
)comment '部门表';

然后我们在两个表里分别插入数据:

INSERT INTO emp (name, age, gender, empno)
VALUES
    ('Alice', 25, 'F', 'A001'),
    ('Bob', 30, 'M', 'B002'),
    ('Carol', 35, 'F', 'C003'),
    ('Dave', 40, 'M', 'C003'),
    ('Eve', 45, 'F', 'B002'),
    ('Frank', 50, 'M', 'A001');
INSERT INTO dep (id, name) VALUES ('A001', '人事部');
INSERT INTO dep (id, name) VALUES ('B002', '市场部');
INSERT INTO dep (id, name) VALUES ('C003', '财务部');

插入数据后,我们的两个表的内容分别如下:

 

这时候如果我们删除人事部,会发生什么呢?

我们来执行看一看。

delete from dep where id='A001';

 结果:

可以看到第一个部门已经被删除了。

但是在雇员表中部门为A001的数据却没有被修改。原因就是我们没有对上面的两个表进行联系。

所以我们要建立外键约束来给两个表的字段进行联系。

如果在建表的时候,就通过建立外键约束,语法如下:

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

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)
)

 约束名称为fk_PerOrders 用此表的P_Id与Persons表的P_Id相连接。

上面的定义方式一定程度上过于繁杂,我们如果在一个表中仅仅需要一个外键,我们可以用下面的方式进行定义:

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

但是我们上面的例子已经创建好表了,所以我们无法用上面的方式添加外键约束,故我们应用下面的方式添加外键约束:

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

 而对于我们的表来说,语句如下:

alter table emp 
add constraint fk_dep_id 
foreign key(empno) 
references dep(id);

选中我们要添加外键约束字段的表,然后为外键约束命名。选择表中添加约束的字段,再连接另一个表的所需要关联的字段。

执行成功后表结构如下:

很明显在empno字段上出现了一个小钥匙,代表的就是我们的外键约束啦。

添加了外键之后,我们如果再次删除部门一会有什么反应呢?

 我们会发现报错了,原因是不能删除或更新父表的记录。

那我们如果就特别想删除父表中的记录或更新父表中的记录,我们该怎么做呢?

首先我们不得不提到删除和更新行为了:

那我们应该怎么设置这种更新或者删除行为呢?

如果我们已经创建了一个外键并且没有设置行为,那么它会默认no action。而且后续没法对外键进行修改,只能删除外键再重新创建再进行设置。

所以代码如下:

alter table emp drop foreign key fk_dep_id;

alter table emp
	add constraint fk_dep_id
		foreign key (empno) references dep (id)
			on delete set null;

 我们先删除了外键,然后再建立外键设置删除约束行为。

我们删除来演示一下:

delete from dep where id='A001';

 我们可以看到empno为A001的变成了null。

其他的删除和更新行为的设置也如同上述语法,只需要简单的改变一下删除和更新行为就可以了。

总结

关于外键约束,本篇内容基本全部覆盖,希望对你有所帮助。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值