mysql(加强篇)---数据约束

本文详细介绍了MySQL的基础知识,包括数据库、表及数据的管理,SQL语句的应用,并深入探讨了数据约束,如主键、外键等概念及其实际应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先给大家回顾一下基础篇我们讲的内容

mysql基础

                    1)mysql存储结构: 数据库 -> 表 -> 数据   sql语句

                    2)管理数据库:

                                            增加: create database 数据库 defaultcharacter utf8;

                                            删除: drop database 数据库;

                                            修改: alter database 数据库 defaultcharacter gbk;

                                            查询: show databases / show create database 数据库;

                    3) 管理表:      

                                             选择数据库:use 数据库;

                                             增加: create table表(字段名1 字段类型,字段名2 字段类型......);

                                             删除: drop table 表;

                                             修改:          

                                                             添加字段: alter table 表 add [column] 字段名字段类型;         

                                                             删除字段:   alter table 表 drop [column] 字段名;

                                                             修改字段类型: alter table 表 modify 字段名新的字段类型;

                                                             修改字段名称: alter table 表 change 旧字段名 新字段名 字段类型;

                                                    修改表名称:   alter table 表 rename [to] 新表名;

                                            查询:

                                                             showtables  / desc student;

                   4) 管理数据:

                                     增加: insert into 表(字段1,字段2,。。。) values(值1,值2.。。。。);

                                     删除: delete from 表 where 条件;

                                     修改: update 表 set 字段1=值1,字段2=值2...... where 条件;

                                     查询:

                                                      4.1)所有字段: select * from 表;

                                                      4.2)指定字段: select 字段1,字段2.... from 表;

                                                      4.3)指定别名: select 字段1 as 别名 from 表;

                         4.4 )合并列: select (字段1+字段2) from 表;

                                                      4.5)去重: select distinct 字段 from 表;

                                                      4.6)条件查询:

                                                                      a)逻辑条件:and(与)     or(或)

                                                                               select* from 表 where 条件1 and/or 条件2

                                                                 b)比较条件: >  <  >= <=  =  <>  between and(在。。。之间)

                                                                               select* from 表 where servlet>=90;

                                                                      c)判空条件:

                                                                                判断null: is null   /  is not null

                                                                               判断空字符串: =''    /  <>''

                                                                      d)模糊条件: like

                                                                                 %:  替换任意个字符

                                                                                 _:   替换一个字符                   

                                                     4.7分页查询:limit 起始行,查询行数

                                                                      起始行从0开始

                                                     4.8排序: order by 字段 asc/desc

                                                                      asc:正序,顺序

                                                                      desc:反序,倒序

                                                     4.9分组查询:group by 字段

                                                     4.10:分组后筛选: having 条件

                                                    

                                   SQL语句的分类:        

                                            DDL:数据定义语言

                                                             create/ drop / alter       

                                            DML:数据操作语句

                                                             insert/ delete /update / truncate

                                            DQL:数据查询语言:

                                               select / show

------ 数据约束

       ---  什么是数据约束  (对用户操作表的数据进行约束)

1.默认值

作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。

                  注意:                    

                                   1)对默认值字段插入null是可以的。

                                   2)对默认值字段可以插入非null

例如我们将学生表的地址都设置为  北京

CREATE TABLE student(

         idINT,

         NAMEVARCHAR(20),

        address VARCHAR(20) DEFAULT '北京'  -- 默认值

)

-- 当字段没有插入值的时候,mysql自动给该字段分配默认值    看下图 我们在1处设置默认为北京   在 2处我们并没有添加 地址, MySQL 回自动给我们添加上默认的地址

-- 注意:默认值的字段允许为null



------非空

    ---- 作用:限制 字段必须赋值

     ----注意 : 非空字段必须赋值    非空字符不能赋null

我们没有向设置的非空字段添加数据时 就会出现警告


非空字符不能赋null  如果 赋值为null 就会报错


唯一  

------ 作用: 对字段的值不能重复

-------注意:  唯一字断可以插入null, 唯一字段可以插入多个null

看下图 当我们设置 sid 为唯一字段时 在2处我们插入一条语句 但是当我们在2处添加第二条语句时  因为sid 同样为1 所以会报错




主键 

作用: 非空+唯一

                          注意:                     

                                   1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。

                                   2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的  id字段。

看下图  我们在1处用关键字 primary key  设置sid  为主键  然后在2处插入一条数据  然后在3处继续插入一条数据  然后就会发现报错了


自增长  

作用: 自动递增

我们在 1处设置sid  为自增长 然后在2处插入数据  可以看到输出的结果是从0001自增到 0003


外键 (重点)

                  作用:约束两种表的数据

                 

                  出现两种表的情况:

                          解决数据冗余高问题:独立出一张表              

                                   例如:员工表  和  部门表

                  问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!! 

 

                  使用外键约束:约束插入员工表的部门ID字段值

 

                  解决办法: 在员工表的部门ID字段添加一个外键约束


-- 部门表(主表)

CREATE TABLE dept(

         id INT PRIMARY KEY,

         deptName VARCHAR(20)

)

 

-- 修改员工表(副表/从表)

CREATE TABLE employee(

         idINT PRIMARY KEY,

         empName VARCHAR(20),

         deptId INT,-- 把部门名称改为部门ID

         --声明一个外键约束

         CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCESdept(id)

         --           外键名称                  外键               参考表(参考字段)

)

 注意:

                           1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!

                           2)主表的参考字段通用为主键!

                           3)添加数据:先添加主表,再添加副表

                           4)修改数据:先修改副表,再修改主表

                           5)删除数据:先删除副表,再删除主表

 

-----------外键约束

-- 员工表

CREATE TABLE employee(

         idINT PRIMARY KEY,

         empNameVARCHAR(20),

         deptNameVARCHAR(20) -- 部门名称

)

 

INSERT INTO employee VALUES(1,'张三','软件开发部');

INSERT INTO employee VALUES(2,'李四','软件开发部');

INSERT INTO employee VALUES(3,'王五','应用维护部');

 

SELECT * FROM employee;

 

-- 添加员工,部门名称的数据冗余高

INSERT INTO employee VALUES(4,'陈六','软件开发部');

 

-- 解决数据冗余高的问题:给冗余的字段放到一张独立表中

-- 独立设计一张部门表

CREATE TABLE dept(

         idINT PRIMARY KEY,

         deptNameVARCHAR(20)

)

-- 修改员工表

CREATE TABLE employee(

         idINT PRIMARY KEY,

         empNameVARCHAR(20),

         deptIdINT,-- 把部门名称改为部门ID

         --声明一个外键约束

         CONSTRAINTemlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ONDELETE CASCADE  -- ON CASCADE UPDATE :级联修改

         --           外键名称                  外键               参考表(参考字段)

)

 

INSERT INTO dept(id,deptName) VALUES(1,'软件开发部');

INSERT INTO dept(id,deptName) VALUES(2,'应用维护部');

INSERT INTO dept(id,deptName) VALUES(3,'秘书部');

 

INSERT INTO employee VALUES(1,'张三',1);

INSERT INTO employee VALUES(2,'李四',1);

INSERT INTO employee VALUES(3,'王五',2);

INSERT INTO employee VALUES(4,'陈六',3);

 

-- 问题: 该记录业务上不合法,员工插入了一个不存在的部门数据

INSERT INTO employee VALUES(5,'陈六',4); -- 违反外键约束: Cannotadd or update a child row: a foreign key constraint fails (`day16`.`employee`,CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))

 

-- 1)当有了外键约束,添加数据的顺序:先添加主表,再添加副表数据

-- 2)当有了外键约束,修改数据的顺序:先修改副表,再修改主表数据

-- 3)当有了外键约束,删除数据的顺序:先删除副表,再删除主表数据

-- 修改部门(不能直接修改主表)

UPDATE dept SET id=4 WHERE id=3;

-- 先修改员工表

UPDATE employee SET deptId=2 WHERE id=4;

 

-- 删除部门

DELETE FROM dept WHERE id=2;

 

-- 先删除员工表

DELETE FROM employee WHERE deptId=2;

 

SELECT * FROM dept;

SELECT * FROM employee;


----------------级联操作

问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!

 

                  级联修改: ON UPDATE CASCADE

                  级联删除: ON DELETE CASCADE



CREATE TABLE employee(

         idINT PRIMARY KEY,

         empNameVARCHAR(20),

         deptIdINT,-- 把部门名称改为部门ID

         --声明一个外键约束

         CONSTRAINTemlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ONUPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :级联修改

         --           外键名称                  外键               参考表(参考字段)

)

注意:级联操作必须在外键基础上使用

-- 级联修改(修改)

-- 直接修改部门

UPDATE dept SET id=5 WHERE id=4;

 

-- 级联删除

-- 直接删除部门

DELETE FROM dept WHERE id=1;


--------- 下一篇讲解数据库的设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值