纯属个人自总结,若有错误,还请各位大佬提出宝贵建议
约束
Not Null
保证数据是否必填,非空限定。
方法一:定义表时直接定义
create table t_student10 (
t_id char(2),
t_name varchar(20),
t_age int,
t_sex char(2),
t_birthday date,
t_salary double not null,
t_award double not null
);
方法二:表定义成功之后,用alter修改
语法:
alter table 表名 change 旧列名 新列名(保持不变) 新列类型(保持不变) 约束;
UNIQUE 唯一约束
唯一约束:唯一但是可以为空,保证列中的值必须唯一
第一种:建表后修改
alter table 表名 add unique(列名);
第二种:创建时添加
create table t_student11 (
t_id char(2) not null unique,
t_name varchar(20),
t_age int,
t_sex char(2),
t_birthday date,
t_salary double not null,
t_award double not null
);
注意:
PRIMARY KEY主键约束
主键约束:唯一并且不能为空
什么是主键?
主键是列的约束,主键约束同时满足NOT NULL和UNIQUE,既不能重复,也不能为空。
列被定义为主键后,主键列的值不能重复,也不能为null,就像QQ的用户名、学号、身份证号。主键是表中的标识列,能够唯一标识表中的一行数据,我们可以根据主键查询表中的数据。当创建表时可通过定义PRIMARY KEY约束来创建主键,一个表只能有一个主键。
方法一:表创建时直接定义
create table t_student12 (
t_id int NOT NULL PRIMARY KEY ,
t_name varchar(20),
t_age int,
t_sex char(2),
t_birthday date,
t_salary double not null,
t_award double not null,
PRIMARY KEY (t_id)
);
方法二:表创建完成后用alter修改
语法:
alter table 表名 add primary key(主键列名);
复合主键
方法一:
alter table tb_name add primary key (id,name);
方法二:
create table test
(
name varchar(19),
id number,
value varchar(10),
primary key (id,name)
)
上面的 name 和 id 字段组合起来就是你test表的复合主键
它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性
一般情况下,主键的字段长度和字段数目要越少越好
AUTO_INCREMENT
把Null插入到AUTO_INCREMENT列中时,MySQL会自动生成下一个序列编号。
没有为AUTO_INCREMENT列插入值时,也会自动生成序列编号。
create table t_student14 (
t_id int AUTO_INCREMENT PRIMARY KEY,
t_name varchar(20),
t_age int,
t_sex char(2),
t_birthday date,
t_salary double not null,
t_award double not null
);
MySQL设置自增之后,如果删除其中一行,那么再次新增时序列不会正常排序;
解决方案:
第一种:初始化自增值 使用truncate
truncate 表名; //会清空表中所有的数据,重新从1开始;
第二种:使用alter修改
alter table 表名 auto_increment=值 ; //设置自增长的起始值
CHECK
check目前mysql版本中是不支持的,可以通过枚举(enum)类型来解决;
第一种:建表时添加枚举类型
create table 表名(sex enum(‘设置列名值’,’ 设置列名值’));
第二种:创建完表之后进行类型修改
alter table 表名 modify 列名 枚举类型;
FOREIGN KEY 外键约束
一般在设置外键约束的时候至少要有两张表;
一张主键表:唯一并且不能为空(primary key)
一张外键表:必须唯一,可为空(unique)
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
方法一:建表时直接创建
--创建班级表
create table t_class(
t_id int AUTO_INCREMENT PRIMARY KEY,
t_name varchar(20),
t_subject varchar(20)
);
--学生表
create table t_student (
t_id int AUTO_INCREMENT PRIMARY KEY,
t_classid int not null,
t_name varchar(20),
t_age int,
t_sex char(2),
t_birthday date,
t_salary double not null,
t_award double not null,
FOREIGN KEY (t_classid) REFERENCES t_class(t_id)
);
方法二:表创建完之后使用alter字段
alter table 主键表 add constraint 外键名 foreign key(主键列名) references 外键表(外键名);
--向班级表中插入数据
insert into t_class(t_name,t_subject) values('16041','java');
insert into t_class(t_name,t_subject) values('16051','.Net');
insert into t_class(t_name,t_subject) values('16061','C#');
--向学生表中插入数据
insert into t_student(t_classid,t_name,t_age,t_sex,t_birthday,t_salary,t_award)
values(1,'xiaoMing',18,'M','1990-01-01',10000,2000);
insert into t_student(t_classid,t_name,t_age,t_sex,t_birthday,t_salary,t_award)
values(1,'xiaoHong',17,'F','1996-01-01',8000,1000);
insert into t_student(t_classid,t_name,t_age,t_sex,t_birthday,t_salary,t_award)
values(2,'xiaoGang',21,'M','1989-01-01',5000,300);
外键的作用
预防插入错误的数据破坏两张表之间的连接关系;
注意:
添加时,必须先添加外键表,在添加主键表
删除时,必须先删除主键表,在删除外键表 ----》保证数据的一致性
如果自己在测试的时候,为了方便可以通过以下语句来停止主外键关系:
第一步:查看主外建关系是否开启:
Select @@foreign_key_checks;
如果查询结果为1,表示主外键时开启状态;
第二步停止主外建关系:
Set @@foreign_key_checks=0; //表示停止主外键关系
查看外键名:
show create table 表名;
注意:
删除外键
语法:
alter table 表名 drop foreign key 外键名(不是列名);
删除唯一约束
语法:
alter table 表名 drop index 对应唯一约束列名;
修改约束
语法:
alter table 表名 change 旧列名 新列名(可保持不变) 新列类型(可保持不变) 新的约束 ;
数据库引擎
什么是数据库引擎?
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
查看当前数据库引擎以及默认引擎
show engines;
面试题:
Mysql中存储的数据引擎有几种方式?常用几种?有什么区别?
常用有两种:
第一种:InnoDB
InnoDB是一个事务型的存储引擎,有行级锁定和外键约束,适用于以下的场合:
- 更新多的表,适合处理多重并发的更新请求。
- 支持事务。
- 可以从灾难中恢复(通过bin-log日志等)。
- 外键约束。只有他支持外键。
- 支持自动增加列属性auto_increment。
支持主外键:
支持事务
第二种:MYISAM
MyIsam 存储引擎独立于操作系统,也就是可以在windows上使用,也可以比较简单的将数据转移到linux操作系统上去。这种存储引擎在创建表的时候,会创建三个文件,一个是.frm文件用于存储表的定义,一个是.MYD文件用于存储表的数据,另一个是.MYI文件,存储的是索引。操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据自然可以优化数据库的查询等操作。
- 不支持事务,但是并不代表着有事务操作的项目不能用MyIsam存储引擎,可以在service层进行根据自己的业务需求进行相应的控制。
- 不支持外键。
- 数据执行快,查询速度很快,如果数据库insert和update的操作比较多的话比较适用。
- 对表进行加锁。
如何修改表中存储引擎方式?
alter table 表名ENGINE=MYISAM;
不支持主外键
不支持事务:
例如:
事务
什么是事务?
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句事务用来管理 insert,update,delete 语句
事务的特性
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事物的三个状态
开启事务:begin 或START TRANSACTION
提交事务:commit;
回滚事务:rollback;
mysql是可以自动提交事务;
执行数据库操作的时候要成功要么失败!
mysql是自动提交事务
查看事务是否是自动提交
select @@autocommit ;
如果查询结果为1,表示事务为自动提交;
例如:
窗口1执行:
窗口2查看数据:
关闭事务自动提交
set @@autocommit =0; //表示关闭事务自动提交
例如:
窗口1:
窗口2查询数据:
开启手动提交时,需要手动commit
存储过程(procedure)
预编译好的;可以直接使用
什么时存储过程?
相当于mysql中的内置函数sum()、max()、min()、avg()、count()
函数里面肯定是封装的sql脚本;
存储过程:可以用来封装sql脚本,可以通过存储过程能完成复杂的sql逻辑;
存储过程的基本语法:
create procedure 存储过程名()
begin
…逻辑处理
end;
创建存储过程时,必须先修改mysql的语句结尾符号 ;
修改mysql的语句结尾符号,例如默认为 ;
修改语句:
delimiter // 转换结束符 将默认的‘ ; ’转成‘ // ’,此时必须遇到 //才会运行
如何调用存储过程:
call 存储过程名();
查看创建好的存储过程:
语法:
show procedure 存储过程名字;
通过存储过程实现一个简单的判断:
例如:
CREATE PROCEDURE ADDS()
-> BEGIN
-> IF 1>5 THEN
-> SELECT * FROM T_CLASS;
-> ELSE
-> SELECT * FROM T_STU;
-> END IF;
-> END
-> //
CALL ADDS()//
多重if语句
CREATE PROCEDURE ADDS()
-> BEGIN
-> IF (1>5) THEN
-> SELECT * FROM T_CLASS;
-> ELSEIF (1>0) THEN
-> SELECT * FROM T_STU;
-> ELSE
-> SELECT COUNT(*) FROM T_STU;
-> END IF;
-> END
-> //
Call ADDS();
带有输入参数的存储过程
create procedure proc_search(in in_ID int )
begin
select * from t_stu where id> in_ID;
end;
//
call proc_search (5) //
-- 模糊查询
create procedure proc_search(in uname varchar(20) charset gbk )
begin
select * from t_stu where name like concat('%', concat(uname,'%'));
end;
//
call proc_search (5) //
插入字符串
create procedure proc_insert(in in_ID int,in in_name varchar(20) charset gbk)
begin
insert into t_stu(id,name,classid)values(in_ID, in_name,1);
end
//
call proc_insert (12,'ss')//
DROP PROCEDURE proc_insert
循环插入
create procedure proc_insert (in in_name varchar(20))
begin
declare n int default 1;
while n <= 20 do
insert into t_stu(name,classid)values(in_name,1);
set n =n+1;
end while;
end
//
DROP PROCEDURE proc_insert
带有输出参数的存储过程
DROP PROCEDURE IF EXISTS mySecond_proc;
create procedure mySecond_proc(out sum int )
begin
select count(*) into sum from t_stu;
set @sum = 1000;
end
//
call mySecond_proc(@sum);
select @sum;
输入和输出参数连用
create procedure mySecond_proc2(in num int,out sum int )
begin
select count(*) into sum from t_stu where id > num;
end
//
call mySecond_proc2(40,@sum);
select @sum;
删除存储过程:
drop propedure 存储过程名;
查询存储过程的详细代码:
语法:
Show create procedure 存储过程名; //可复制出代码进行修改操作
存储过程中套事务
Drop procedure if exists proc_deleteClass//
create procedure proc_deleteClass(in classid int )
begin
start transaction;
delete from t_stu where classid = classid;
delete from t_class where id = classid;
commit;
end
//
call proc_deleteClass (2);