MySQL数据库(二)

MySQL数据库(一):
https://blog.csdn.net/Veer_c/article/details/103844059
MySQL数据库(二):
https://blog.csdn.net/Veer_c/article/details/103844537
MySQL数据库(三):
https://blog.csdn.net/Veer_c/article/details/103844739

数据约束

数据约束: 给表添加数据约束,从而约束用户操作表数据的行为。
5.1 默认值约束

-- 数据约束 :给表添加一些数据约束从而可以达到约束用户操作数据的效果
-- 1:默认值约束(default-- :当给这个字段没有添加值的时候,会给一个默认值,如果给默认值约束的字段添加的值为null的时候,那么他的字段值就为null
-- 创建一个stu表
CREATE TABLE stu(
id INT,
NAME VARCHAR(20),
-- 给性别gender这个字段添加一个默认值约束
gender VARCHAR(2) DEFAULT '男'
);
-- 给stu表中添加几个数据
INSERT INTO stu VALUES(1,'张三','男');
INSERT INTO stu(id,NAME) VALUES(2,'李四');
-- 给stu表中插入数据,性别为null
INSERT INTO stu VALUES(3,'刘诗诗',NULL);

注意:默认值约束只会在字段没有给出值的时候,系统才会给出一个默认的值,但是,如果给出的默认的字段值是null的话,则系统不会给出默认值

5.2 非空约束

-- 2.非空约束(not null),插入的字段不为null,而且必须插入数据
CREATE TABLE stu(
-- 给stu表中的id字段添加一个非空约束
id INT NOT NULL,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 给这张表中添加一个元素,不插入id字段的值
INSERT INTO stu(NAME,gender) VALUES('郭德纲','男');
-- 给这张表添加一条数据,id字段的值直接给成null,这样的话是插入不进去的。。

5.3 唯一约束

-- 唯一约束(unique)
-- 给stu表添加一个唯一约束
CREATE TABLE stu(
-- 给stu表中的id字段添加唯一约束
id INT UNIQUE,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 给表中插入两条id相同的数据
INSERT INTO stu VALUES(1,'刘德华','男');
INSERT INTO stu VALUES(1,'张学友','男');-- Duplicate entry '1' for key 'id',无法插入重复的id值
-- 给表中插入一条id为null的数据,当给id添加了唯一约束之后,依然可以给他插入多条null值,不会出现重复
INSERT INTO stu VALUES(NULL,'吴奇隆','男');
INSERT INTO stu VALUES(NULL,'刘诗诗','女');
-- 经过我们的分析,我们认定我们的这个id字段(唯一+非空)--主键(primary key)
-- 注意:
-- 1.一般来说我们需要给每一张表都设定一个主键字段(非空+唯一),用来标示一条信息的唯一性
-- 2.我们一般不会将业务字段设定为主键字段,比如name字段,一般我们会给每一张表添加一个id字段作为主键字段
-- 3.建议给每张表添加一个主键字段,用来标示每一条数据的唯一性
CREATE TABLE stu(
-- 给stu表中的id字段设置为主键(唯一+非空)
id INT PRIMARY KEY,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 给表中插入两条id为1的学生信息
INSERT INTO stu VALUES(1,'华仔','男');
INSERT INTO stu VALUES(1,'华建','男');-- Duplicate entry '1' for key 'PRIMARY'
-- 给表中插入id为null的元素
INSERT INTO stu VALUES(NULL,'杰伦','男');-- Column 'id' cannot be null
-- 上面的实验我们可以得出结论,当我们给id字段设置了主键约束后,这个id字段就非空+唯一了

5.4 自增长约束

-- 自增长约束(auto_increment)
-- 给stu表中的id字段添加一个主键自增长约束
CREATE TABLE stu(
-- 给stu表中的id字段设置主键自增长约束,我们其实就将id这个字段交给了数据库自己去维护,我们自己不需要去动他
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
gender VARCHAR(2)
);
-- 给stu表中添加两条数据
INSERT INTO stu(NAME,gender) VALUES('华仔','男');
INSERT INTO stu(NAME,gender) VALUES('周杰伦','男');
INSERT INTO stu(NAME,gender) VALUES('周杰伦','男');
INSERT INTO stu(NAME,gender) VALUES('周杰伦','男');
-- 删除id为4的数据
DELETE FROM stu WHERE id=4;
-- 给表中添加一条数据
INSERT INTO stu(NAME,gender) VALUES('张学友','男');
-- delete from 这种删除数据的方式,无法重置自增长的主键
-- 删除stu的全表数据
DELETE FROM stu;
-- 添加一条数据
INSERT INTO stu(NAME,gender) VALUES('张学友','男');
-- 删除全表数据的truncate table 表名 ,删除全表数据,这种删除全表数据的方式可以重置主键
TRUNCATE TABLE stu;
-- 给表中添加一条数据
INSERT INTO stu(NAME,gender) VALUES('华仔','男');

注意:
delete from在删除数据的时候,不会重置主键自增长,也就是说,当利用了delete from删除了数据之后,如果再要插入数据的话,那么,第二次重新插入的数据的ID是接着 上次删除之后的ID,而 truncate table+表名这种删除方式,会重置主键自增长,即ID会从1开是重新算的。

数据约束(2)

6.外键约束:
当我们在使用一张表的时候,如果有多个数据出现重复值,我们为了节省内存可以利用两张表,当一张表的数据来源于另外一张表的时候,这种情况就会出现一个外键约束。

1,先创建一个数据库,然后在创建一个员工表,用于存储员工的信息
CREATE DATABASE day20 DEFAULT CHARACTER SET utf8;
-- 创建一张员工表(id,name,age,deptName)
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
deptName VARCHAR(20)
);
-- 给表中添加几条数据
INSERT INTO employee(NAME,age,deptName) VALUES('华仔',50,'软件开发部');
INSERT INTO employee(NAME,age,deptName) VALUES('小月月',30,'软件开发部');
INSERT INTO employee(NAME,age,deptName) VALUES('孙胖子',40,'软件开发部');
INSERT INTO employee(NAME,age,deptName) VALUES('郭德纲',50,'软件维护部');
INSERT INTO employee(NAME,age,deptName) VALUES('谦哥',50,'软件维护部');
INSERT INTO employee(NAME,age,deptName) VALUES('张学友',55,'秘书部');

分析:在这个过程中我们的deptname 字段出现了大量重复发的值,这个是非常浪费我们的数据库的内存的,俗称数据冗余,我们可以将上述代码进行改造,可以创建两张表,一张用于存储学生的信息,一张专门用于存储部门信息,这样可以为我们的数据库节省内存。

-- 在我们的数据库中创建一张部门表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
deptName VARCHAR(20)
);
-- 给部门表插入数据
INSERT INTO dept(deptName) VALUES('软件开发部');
INSERT INTO dept(deptName) VALUES('软件维护部');
INSERT INTO dept(deptName) VALUES('秘书部');

6.1给部门加上ID字段后,创建一个改造过后的数据表

-- 给员工表加上部门id之后,改造员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
deptId INT
);
-- 给改造后的员工表中插入数据
INSERT INTO employee(NAME,age,deptId) VALUES('华仔',50,1);
INSERT INTO employee(NAME,age,deptId) VALUES('小月月',30,1);
INSERT INTO employee(NAME,age,deptId) VALUES('孙胖子',40,1);
INSERT INTO employee(NAME,age,deptId) VALUES('郭德纲',50,2);
INSERT INTO employee(NAME,age,deptId) VALUES('谦哥',50,2);
INSERT INTO employee(NAME,age,deptId) VALUES('张学友',55,4);

分析:在我们改造过后的数据表中,当再次给员工表中插入一个不存在的ID字段的时候,依然是可以插入的,但是这中情况明显是错的,所以我们要给员工的deptId 字段 设置一个外键约束,让这个字段依赖于部门表的ID字段这样不会出错。

CREATE TABLE employee(-- 附表
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
deptId INT,-- 外键
CONSTRAINT emp_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
-- 声明      外键名称   外键        字段   依赖于   那张表的那个字段
);

附表:受约束的表
主表:约束附表的表
6.2 什么情况下外键会起作用?
(1):当我们向附表中插入主表中不存在的数据的时候,
(2):当我们要删除附表中还在是使用主表的数据的时候,
(3):当我们将附表中的数据修改为主表中不存在的数据的时候,
6.3 有了外键之后,我们如何操作数据库

-- 1.插入数据的时候,先插入主表,再插入副表
-- 需求:给副表中插入刘亦菲,deptId=4,
INSERT INTO dept(deptName) VALUES('后勤部');
INSERT INTO employee(NAME,age,deptId) VALUES('刘亦菲',30,4);
-- 2.当我们修改副表中的数据的时候,先修改主表
-- 需求:将华仔的部门改为4
UPDATE employee SET deptId=4 WHERE id=1;
-- 3.删除主表数据的时候,先得将副表中的数据删除干净,再去删除主表中的数据
-- 需求:删除主表中的id为4的部门
DELETE FROM employee WHERE id=1;
DELETE FROM employee WHERE id=8;
DELETE FROM dept WHERE id=4;

7.级联技术

当我们修改或者删除主表的时候,附表会同时收到影响,更加方便我们的操作。

-- 需要将部门表中的秘书部id改为4
-- 创建一张员工表,添加外键约束,并且添加级联(修改的级联技术ON UPDATE CASCADE)
CREATE TABLE employee(-- 附表
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
deptId INT,-- 外键
CONSTRAINT emp_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
-- 声明      外键名称   外键        字段   依赖于   那张表的那个字段
);
-- 修改部门表中的秘书部id该4
UPDATE dept SET id=4 WHERE id=3;
-- 删除id为4的秘书部,ON DELETE CASCADE
DELETE FROM dept WHERE id=4;

MySQL数据库(一):
https://blog.csdn.net/Veer_c/article/details/103844059
MySQL数据库(二):
https://blog.csdn.net/Veer_c/article/details/103844537
MySQL数据库(三):
https://blog.csdn.net/Veer_c/article/details/103844739

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值