首页 > 数据库 >mysql约束

mysql约束

时间:2024-05-08 16:11:28浏览次数:25  
标签:删除 外键 约束 dept emp mysql 主表 id

1. 概述

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

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

分类:

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


2. 约束演示

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


对应的建表语句为:

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 '性别'

);


3. 外键约束

3.1 介绍

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

我们来看一个例子:


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

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

3.2 语法

  • 添加外键
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);

  • 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;


案例:删除 emp 表的外键 fk_emp_dept_id。

alter table emp drop foreign key fk_emp_dept_id;


3.3 删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:


具体语法为:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) 

REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;


演示如下:

由于NO ACTION 是默认行为,我们前面语法演示的时候,已经测试过了,就不再演示了,这里我们再演示其他的两种行为:CASCADE、SET NULL。

  • CASCADE
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) 

references dept(id) on update cascade on delete cascade ;
  1. 修改父表id为1的记录,将id修改为6

我们发现,原来在子表中dept_id值为1的记录,现在也变为6了,这就是cascade级联的效果。

在一般的业务系统中,不会修改一张表的主键值。

  1. 删除父表id为6的记录

我们发现,父表的数据删除成功了,但是子表中关联的记录也被级联删除了。

  • SET NULL
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) 

references dept(id) on update set null on delete set null ;

接下来,我们删除id为1的数据,看看会发生什么样的现象。

我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp ,我们发现子表 emp 的 dept_id 字段,原来 dept_id 为 1 的数据,现在都被置为 NULL 了。

标签:删除,外键,约束,dept,emp,mysql,主表,id
From: https://www.cnblogs.com/pine1203/p/18180094

相关文章

  • mysql函数
    1.字符串函数 MySQL中内置了很多字符串函数,常用的几个如下: 演示:concat:字符串拼接selectconcat('Hello','MySQL');lower:全部转小写selectlower('Hello');upper:全部转大写selectupper('Hello');lpad:左填充selectlpad('01',......
  • mysql8 根据ibd文件恢复表
    原文https://github.com/ddcw/ibd2sql 环境:mysql8.0.33一、创建测试数据Mysql8.0.32环境:mysql>createtablet1(idint,namevarchar(200));QueryOK,0rowsaffected(0.02sec)mysql>insertintot1select1,'a';QueryOK,1rowaffected(0.01sec)......
  • MySQL索引数据结构
    什么是索引索引在项目中还是比较常见的,它是帮助MySOL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。索引的底层数据结构MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储......
  • mysql基本语法
    1.DDLDataDefinitionLanguage,数据定义语言,用来定义数据库对象(数据库,表,字段)。 1.1数据库操作查询所有数据库showdatabases;查询当前数据库selectdatabase();创建数据库createdatabase[ifnotexists]数据库名[defaultcharset字符集][col......
  • MYSQL 数据库之锁
    本文参考哔哩哔哩黑马TODO补充详细mysql实例操作语句全局锁全局锁就是对整个数据库实例加锁加锁后处于只读状态后续的DML的写语句和DLL不执行表级锁表锁表锁分为两类:表共享锁(readlock)表独占写锁(writelock)-->语法:加锁locktables表名...read/write......
  • Mysql脚本——备份客户自建数据库
    #!/bin/bashDATE=$(date+%F_%H-%M-%S)HOST=127.0.0.1USER=rootPASS=Linux@123PORT=3306BACKUP_DIR=./db_backup#删选客户自建数据库(排除系统库)DB_LIST=$(mysql-u$USER-p$PASS-h$HOST-P$PORT-s-e"showdatabases;"2>/dev/null|egrep-v"Database|......
  • mysql死锁优化
    查看连接showprocesslist--已开启10秒以上的活跃连接SELECTid,user,db,command,state,time,infoFROMinformation_schema.processlistwherecommand<>'sleep'andtime>10orderbytime;--已运行超过10s的执行计划SELECTid,user,db,command,state,timeFROMinfo......
  • Glang&Mysql&Excel
    packagemainimport( "database/sql" "fmt" "log" _"github.com/go-sql-driver/mysql" "github.com/tealeg/xlsx")funcmain(){ //连接MySQL数据库 db,err:=sql.Open("mysql","root:123456......
  • mysql练习 —— 关于一些函数的使用
    学校作业,拿来记录一下。(老师出的习题貌似是从一本书上拿到的)Q1:使用RAND()函数来获得3个随机值。A1: 解析:rand()函数,获得随机值,产生0-1的随机值。(random,随机) Q2:求3和4的平方根。A2: 解析:sqrt()用于求解平方根。 Q......
  • MySQL如何定位慢查询
    做压力测试的时候有的接口非常的慢,接口的响应时间超过了2秒以上。系统部署了运维的监控系统Skywalking,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个SQL语句出了问题。另外MySQL中也提供了慢日......