首页 > 其他分享 >4-约束

4-约束

时间:2023-05-01 10:45:43浏览次数:27  
标签:name age 外键 约束 dept emp id

1.概述

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中数据的正确、有效性和完整性。

分类:

image-20230501090726321

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

2. 约束演示

案例需求: 根据需求,完成表结构的创建。需求如下:

image-20230501090835632

对应的建表语句为:

mysql> CREATE TABLE tb_user(
    -> id int AUTO_INCREMENT PRIMARY KEY 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 '性别'
    -> );
Query OK, 0 rows affected, 1 warning (0.03 sec)

展示:

mysql> desc tb_user;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int         | NO   | PRI | NULL    | auto_increment |
| name   | varchar(10) | NO   | UNI | NULL    |                |
| age    | int         | YES  |     | NULL    |                |
| status | char(1)     | YES  |     | 1       |                |
| gender | char(1)     | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可,需要关注其语法。我们执行上面 的 SQL 把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以 生效

insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),
('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');
insert into tb_user(name,age,gender) values ('Tom5',120,'男');

上面,我们是通过编写 SQL 语句的形式来完成约束的指定,那加入我们是通过图形化界面来创建表结构 时,又该如何来指定约束呢? 只需要在创建表的时候,根据我们的需要选择对应的约束即可。

image-20230501095657271

3.外键约束

3.1 介绍

外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

我们来看一个例子:

image-20230501095802662

左侧的 emp 表是员工表,里面存储员工的基本信息,包含员工的 ID、姓名、年龄、职位、薪资、入职日 期、上级主管 ID、部门 ID,在员工的信息中存储的是部门的 ID dept_id,而这个部门的 ID 是关联的 部门表 dept 的主键 id,那 emp 表的 dept_id 就是外键,关联的是另一张表的主键。

注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联, 所以是无法保证数据的一致性和完整性的。

没有数据库外键关联的情况下,能够保证一致性和完整性呢,我们来测试一下。

准备数据

create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
)comment '部门表';

INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,'销售部'), (5, '总经办');

create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';

INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)VALUES(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),(2, '张无忌', 20,'项目经理',12500, '2005-12-05', 1,1),(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),(5, '常遇春',43, '开发',10500, '2004-09-07', 3,1),(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1);

image-20230501100356071

结果,我们看到删除成功,而删除成功之后,部门表不存在 id 为 1 的部门,而在 emp 表中还有很多的员 工,关联的为 id 为 1 的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的 外键约束。

3.2 语法

1. 添加外键

语法:

CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)
REFERENCES 主表 (主表列名) ;

案例:

为 emp 表的 dept_id 字段添加外键约束,关联 dept 表的主键 id。

语法:

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

结果显示:

image-20230501100928391

添加了外键约束之后,我们再到 dept 表(父表)删除 id 为 1 的记录,然后看一下会发生什么现象。 此时 将会报错,不能删除或更新父表记录,因为存在外键约束。

image-20230501101202653

2. 删除外键

案例:

删除 emp 表的外键 fk_emp_dept_id。

语法:

alter table emp drop foreign key fk_emp_id;

执行成功

image-20230501101450485

3.3 删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。

具体的删除/更新行 为有以下几种:

image-20230501101541309

具体语法为:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

标签:name,age,外键,约束,dept,emp,id
From: https://www.cnblogs.com/NorthPoet/p/17366241.html

相关文章

  • 差分约束
    差分约束系统用于求解一组特殊的N元一次不等式组.它包含了N个变量x1~xn和M个约束条件,其中每个约束条件形如:\(x_i\leqslantx_j+c_k\)(最短路),\(x_i\geqslantx_j+c_k\)(最长路)约束条件\(x_i\leqslantx_j+c_k\),可转化为一条有向边\(j\stackr......
  • 芯片SDC约束 -复制保存
    https://www.cnblogs.com/pcc-uvm/p/16996456.html?share_token=9651df97-e94c-4653-bf71-0a0fd6ca415e&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_android&utm_campaign=client_share芯片SDC约束1.芯片开发流程 数字开发过程中主要可以分为数......
  • Oracle数据库设计——定义约束 主键
    Oracle数据库设计——定义约束主键[code]声明约束主键(PRIMARYKEY)一张表不一定有主键,但大多数表都创建了主键,主键值必须唯一并且组成主键的各列都不能为空。想象一下存储学生信息的一张表。在学生表(STUDENTS)每个学生有且仅有一行记录。因此,在S......
  • nsga2-带约束条件的多目标优化
    logiccodeclcclearcloseall%%定义自变量范围nvar=5;nobj=2;npop=20;maxit=50;pc=0.8;nc=round(pc*npop/2)*2;mu=0.05;%自变量约束条件varmin=[1030.66];varmax=[132.8211.641];%自变量变化步长step=[10.10.50.051];len=(varmax-varmin).*step;......
  • Unity3D:目标约束
    推荐:将NSDT场景编辑器加入你的3D工具链3D工具集:NSDT简石数字孪生目标约束(AimConstraints)AimConstraint可旋转游戏对象以朝向其源游戏对象。还可针对另一个轴保持一致方向。例如,可将AimConstraint添加到摄像机。要在约束瞄准摄像机时保持摄像机直立,请指定摄像机的向上轴和......
  • 【IT老齐012】外键约束
    【IT老齐012】外键约束优点保证数据的完整性和一致性级联操作方便数据一致性交给数据库,代码量小缺点性能问题额外的数据一致性校验查询并发问题外键约束会启用行级锁主表写入时会进入阻塞级联删除问题多层级联删除会让数据变得不可控数据耦合问题数据库......
  • Employees、临时表的创建 & 外键约束
    一.Employees1.Employees数据库介绍Employees数据库是一个用于学习和测试的数据库,大约160MB,4百万条记录2.Employees的安装2.1安装[root@MyServertest_db]>mysql-uroot-p<employees.sql2.2验证[root@vm-1employees_db]#timemysql-uroot-p-t<test_employ......
  • mysql字段过长无法作为约束、索引的解决方案
    背景:对接过程中遇到一个场景 需要用(网页链接+请求id)作为唯一约束,由于url很长,我在一开始就设置为了text字段。ALTERTABLExxx.xxxADDCONSTRAINTxxxUNIQUEKEY(xxxx);在加约束时报错:SQL错误[1170][42000]:BLOB/TEXTcolumn'xxxx'usedinkeyspecificationwith......
  • mysql索引--普通索引,唯一索引,主键索引,参照完整性约束,数据完整性约束
    --方法1:createindex--对employee表的员工部门号列创建普通索引depart_ind--createindexdepart_indonemployees(员工部门号);--对employee表的姓名和地址列创建复合索引ad_ind;--createindexad_indonemployees(姓名,地址);--对departments表的部门名称列......
  • 建表约束
    NOT NULL 非空  UNIQUE 唯一约束,意味这个值是不可以重复的,也是不可以为空的。。。2种写法:   PRIMARYKEY    主键约束(主关键字),自带非空、唯一、索引    DEFAULT  默认值 给这个一个缺省值,比如默认填入的人的性别为男  如果为给......