Java基础87 MySQL数据约束
1、默认值
-- 创建表student1,设置address字段有默认值
create table student1
(
id int,
name varchar(32),
address varchar(32) default '广东省深圳市宝安区xxxxx' -- 设置默认值
);
如上表,如果向student1表中插入数据时,address 字段没有给任何值时,则自动插入默认值广东省深圳市宝安区xxxxx。
insert into student1 values(1,'李四','广州番禺xxx');
insert into student1(id,name) values(2,'王五'); -- address字段会插入默认值

2、非空
-- 创建表student2,设置sex字段必须有值(不为null,也不能是空白)
create table student2
(
id INT,
name varchar(32),
sex varchar(2) not null default '女' -- 非空,且设置了默认值'女',否则MySQL会自动插入空格(总之是空白,什么都没有)
);
insert into student2(id,name) values(1,'张三');
insert into student2 values(2,'李四','男');
insert into student2(id,name,sex) values(3,'王五',NULL); -- 报错Column 'sex' cannot be null。不能插入非空字符

3、唯一
-- 创建表student3,设置主键的唯一性,即:该字段的值不能重复(唯一性)
create table student3
(
id int unique,-- 唯一
name varchar(32)
);
1 inert into student3 values(1,'张三');
insert into student3 values(1,'李四'); -- 再创建一次,就报错了Duplicate entry '1' for key 'id',违反了唯一性。
insert into student3(name) values('王五'); -- 但是,这条语句可以插入好多次都不报错

4、主键
-- 创建表student4,设置id字段为主键(即:非空+唯一)
create table student4
(
id int primary key, -- 主键
name varchar(32)
);
insert into student4(name) values('李斯'); -- id字段不给值的话,则从0开始赋值;主键设置自增长是从1开始赋值
insert into student4 values(3,'李四'); -- 这两条语句,不管哪一条,只要执行两遍,就会报错,违反了主键的唯一性(只要id值重复了,就报错)

5、自增长
5.1、设置主键自动递增
-- 创建表student5,设置主键自增长
create student5
(
id int primary key auto_increment, -- 自增长,从1开始
name varchar(32)
);
insert into student5(name) values('李斯'); -- id字段不给值的话,则从0开始赋值
insert into student5 values(3,'李四'); -- 先执行上面一条语句一次,再执行这条语句一次,最后连续执行上面一条语句2次,不会报错,会自动跳过2号id,但是id会从3开始自增

5.2、设置主键自动递增,并且用零来填充
-- 创建表student6,设置主键自增长,并且使用零填充
CREATE TABLE student6
(
id int ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增长,从零开始;zerofill:零填充
name VARCHAR(32)
);
INSERT INTO student6(NAME) VALUES('狗娃'); -- 执行三次

5.3、处理自增长主键的最后一条数据或全部数据被删除后,已删除的主键被闲置的问题
原有的所有数据,如下:

如果,id为3的数据被删除,或者该表的全部数据都被删除,那么下次再插入数据时,都是从id为4开始自增长
-- 如果是下面这种方法删除,那么下次再插入数据时,都是从id为4开始自增长
delete from student5;
3 delete from student5 where id = ; -- 只删除id为3的那条数据

如果想要从id为3或从头(1)开始自增长,那么得使用完全删除数据的方法
truncate table student5; -- 完全删除所有数据
TRUNCATE TABLE student5 WHERE id = 4; -- 完全删除该条数据

6、外键
-- 主表(部门表)
CREATE TABLE department
(
id INT PRIMARY KEY,
deptName VARCHAR(32)
); -- 先创建主表,再创建从表 -- 从表/副表(员工表)
CREATE TABLE employee
(
id INT PRIMARY KEY,
emplName VARCHAR(32),
deptId INT, -- 把部门名称,改为了部门id
CONSTRAINT employee_department_fk FOREIGN KEY(deptId) REFERENCES department(id)
-- 外键名称 外键 参考表(参考的字段)
);
注意:
1、当有了外键约束时,向表中添加数据的顺序:先添加主表,再添加副表的数据。
2、当有了外键约束时,修改表内数据的顺序:先修改副表,再修改主表的数据。
3、当有了外键约束时,删除表内数据的顺序:先删除副表,再删除主表的数据。
INSERT INTO department VALUES(1,'软件开发部');
INSERT INTO department VALUES(2,'软件测试部');
INSERT INTO department VALUES(3,'销售部');

INSERT INTO employee VALUES(1,'张三',2);
INSERT INTO employee VALUES(2,'李四',1);
INSERT INTO employee VALUES(3,'王五',2);
INSERT INTO employee VALUES(4,'王五',3);

SELECT id,emplName,(SELECT deptName FROM department WHERE id = (SELECT deptId FROM employee WHERE id = e.id)) AS deptName FROM employee e; -- 合在一起查

7、级联操作
级联修改:ON UPDATE CASCADE
级联删除:ON DELETE CASCADE
-- 主表(部门表)
CREATE TABLE department
(
id INT PRIMARY KEY,
deptName VARCHAR(32)
); -- 先创建主表,再创建从表 -- 从表/副表(员工表)
CREATE TABLE employee
(
id INT PRIMARY KEY,
emplName VARCHAR(32),
deptId INT, -- 把部门名称,改为了部门id 级联修改 级联删除
CONSTRAINT employee_department_fk FOREIGN KEY(deptId) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE
-- 外键名称 外键 参考表(参考的字段)
);

注意:级联操作必须在外键的基础上使用
7.1、执行级联修改,把部门表的软件开发部的id改为5(注:因为在外键上加上了级联操作关系,故 直接对主表进行操作时,也不会报错)
UPDATE department SET id = 5 WHERE id = 1;
结果图

7.2、执行级联删除,把部门表的软件开发部id = 5的部门删除掉
DELETE FROM department WHERE id = 5; -- 删的是部门,但 由于级联关系,员工表对应的员工 所在的部门的该条数据也将删除,即id为2的员工将删除

|
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/10545134.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
Java基础87 MySQL数据约束的更多相关文章
- Java基础86 MySQL数据库基础知识
本文知识点(目录): 1.MySQL数据库的概述 2.MySQL数据库的管理[对数据库的操作](查询.删除.创建数据库,以及查询和修改数据库的编码模式) 3.表的管理[对数据库 表的操作] ...
- Mysql数据约束 整理
数据约束 1.默认值: 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非null CREATE TABLE ...
- MYSQL基础操作之数据约束与关联查询
一.MYSQL约束 1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值. 默认值的字段允许为空. 对默认值字段也可以插入null. CREATE TABLE STUDENT( I ...
- Java基础_0311: 数据表与简单Java类映射
数据表与简单Java类映射 现在假设有如下的关系表,现在要求实现如下的数据关联操作: 一个部门有多个雇员: 一个雇员有一个或零个领导 代码实现 class Dept { private int dep ...
- Java基础89 MySQL存储过程
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- Java基础之MySQL数据库与JDBC
一.数据库 DBMS 数据库管理系统 是由多个程序构成的专门用来管理大量数据的计算机系统 Server 提供数据存储.检索.计算等服务的网络程序+系统服务 Notifier ...
- Java基础练习1(数据类型转换)
1.下列代码的输出结果是:()(单选) public static void main(String[] args){ double money = 3.0; money -= 2.9; System ...
- MySQl数据约束练习
默认值约束 1 CREATE TABLE USER( 2 uid INT, 3 uname VARCHAR(10), 4 address VARCHAR(30) DEFAULT '山东省' 5 ) ...
- Java基础90 MySQL触发器
1.创建触发器 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...
随机推荐
- thinkphp在app接口开发过程中的通讯安全认证
对于我们写好的接口,如果不经过安全认证就可以直接访问的话,则将对我们网站产生非常大的安全隐患,一些hack可能直接用你的接口去操作数据库,后果无法估量.那么如何才能进行有效的安全验证呢? 这里我采用了 ...
- SpringBoot 5.SpringBoot小知识讲解
1.修改 server 端口: 在 application.properties 中添加 server.port=9090,我们的端口号就会变成9090了. 2.自定义配置Web: 2.1 创建 Cu ...
- Angular中ui-grid的使用详解
Angular中ui-grid的使用 在项目开发的过程中,产品经理往往会提出各种需求,以提高用户体验.最近,项目中用到的表格特别多,而且表格的列数和行数也超多.为了让用户浏览更爽,产品经理提出,当表格 ...
- 洛谷P4720 【模板】扩展卢卡斯
P4720 [模板]扩展卢卡斯 题目背景 这是一道模板题. 题目描述 求 C(n,m)%P 其中 C 为组合数. 输入输出格式 输入格式: 一行三个整数 n,m,p ,含义由题所述. 输出格式: 一行 ...
- Degree Set CodeForces - 976D(双指针)
题意: 构造一个无向图,使得无向图里的所有点的度数 所组成的集合 即为给出的几个数 解析: 题中的数是以上升的顺序给出的, 我们对于dn+1个数进行处理,对于当前数i,有两个操作 1.向后边的所有点连 ...
- 使用VBA批量转换Excel格式,由.xls转换成.xlsx
问题分析: Excel2007以前的格式是.xls,之后的格式是.xlsx.打开单独的一个Excel文档,使用“另存为”功能,可以很轻松的转换格式.但是面对几百个Excel表这样就太累了,搜索很久,也 ...
- c++11 强类型枚举
c++11 强类型枚举 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...
- BZOJ 1031 [JSOI2007]字符加密Cipher 后缀数组教程
1031: [JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一 ...
- asp.net性能优化之使用Redis缓存(入门)
1:使用Redis缓存的优化思路 redis的使用场景很多,仅说下本人所用的一个场景: 1.1对于大量的数据读取,为了缓解数据库的压力将一些不经常变化的而又读取频繁的数据存入redis缓存 大致思路如 ...
- Hadoop生态圈-Flume的组件之自定义Sink
Hadoop生态圈-Flume的组件之自定义Sink 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍sink相关的API使用两个小案例,想要了解更多关于API的小技 ...