2-02一个练习时长七天半但是的mysql小白的学习过程记录-存储过程-事务处理-主键外键-五大约束

今天早上你遇到一个问题

在这里插入图片描述
连不上服务器了

好不出来

你决定登录自己的数据库

打开用户登陆界面你发现自己不知道密码,使用默认密码也登陆不上

失败码是10060

戳这里----->mysql无法连接10061问题

顺着链接里面介绍的操作你成功登录

但是空空如也没有数据

你要自己新建表单插入数据

戳这里-------->创建表单-create
戳这里-------->插入数据-populate

bingo

存储过程

为什么你要使用存储过程?

通过将一系列复杂的操作封装在简单易用的单元中,每次执行相同操作时,只需要调用存储过程就可以完成复杂的工作。

为了对邮件发送清单中具有邮件地址的顾客进行计数,你想要构建一个简单的存储过程。

戳这里------->MySQL存储过程的基本语法

CREATE PROCEDURE mailingcountlist(OUT cnt INT)
BEGIN 
SELECT COUNT(*) 
FROM customers
WHERE  cust_email IS NOT NULL
INTO cnt;
END;

报出错误
鉴于不同的数据库软件,你使用的语法也不尽相同,着手上网寻找问题的原因

问题出在哪里呢?是没有在存储过程中declare变量吗?你不断地在心里问自己

该死,在添加上变量声明后,仍然报告错误

不一会儿,你已经尝试了各种办法(包括在变量前面添加@,删去end后面的分号,将into语句改成简单的等号,把第一行的out cnt int放在存储过程中),可问题始终没有解决

最后,你查阅了sql帮助手册

 CREATE PROCEDURE citycount (IN country CHAR(3), OUT cities INT)
       BEGIN
         SELECT COUNT(*) INTO cities FROM world.city
         WHERE CountryCode = country;
       END//

决定依葫芦画瓢修改自己的语句

CREATE PROCEDURE mailingcountlist(OUT cnt INT)
BEGIN 
	SELECT COUNT(*) INTO cnt
	FROM customers
	WHERE  cust_email IS NOT NULL;
END 

依然不行啊

难道是我select语句出错了吗?

可单独运行select语句时,一切正常,也给出了正确的计数结果

再次查看帮助

你发现

CREATE
    [DEFINER = user]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

根本不用加上begin和end(可能仅仅在存储过程中包含多个过程时,你才需要使用begin&end)

迷惑

CREATE PROCEDURE mailingcountlist(OUT cnt INT)
	
		SELECT COUNT(*) INTO cnt
		FROM customers
		WHERE  cust_email IS NOT NULL;

bingo

可谁又曾料想到,五天后你又遇到一个问题

上述存储过程只能存储一条语句,五天后的你想存储多条语句,这个时候仍然需要使用begin和end

CREATE PROCEDURE p1()
BEGIN
SELECT *
FROM orders;
SELECT * 
FROM orderitems;
END 
CALL p1();

上诉代码仍然出错

你又去网上搜寻答案

在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。

噢~
再次修改代码

delimiter //
CREATE PROCEDURE p1()
BEGIN
SELECT *
FROM orders;
SELECT * 
FROM orderitems;
END //
CALL p1();

bingo
在这里插入图片描述
好了现在你重新回到五天前的工作中

如何调用这个存储过程?

按照网上的说法

你键入了一下代码

declare cnt;
cnt = call mailingcountlist();

失败,把返回值放在存储过程里面再试试

declare cnt;
call mailingcountlist(cnt);

失败,修改变量声明的方式

set @cnt;
call mailingcountlist(@cnt);

欧克,但还没做输出

set @cnt;
call mailingcountlist(@cnt)
select @cnt;

欧克

事务处理
戳这里了解------>MySQL事务,事务的基本概念,MySQL的基本事务处理
为什么要使用事务处理?

使用事务处理(transaction processing),确保成批的sql操作,要么执行,要么完全不执行,来维护数据库的完整性

在使用事务处理时,有几个必须知道的关键词:

事务-transaction-指的是一组sql语句
回退-rollback-指的是撤销指定sql语句的过程
提交-commit-指的是将未存储的sql语句结果写入数据表库
保留点-save point-指的是事务处理中的设置的临时占位符-placeholder-可以对他发起回退

事务处理用来管理insert,update,delete语句,不能回退select,create,drop操作

事务处理的语法

START TRANSACTION; -- 这个后面要加上分号
SAVEPOINT IN1; -- 每一个 rollback 都需要加上分号
INSERT INTO orders
VALUES(20011,
		 NULL,
		 '1000000004');
SAVEPOINT IN2; -- 如果已经 rollback to IN2,那就不能再rollback to IN3了
INSERT INTO orders
VALUES(20012,
		 NULL,
		 '1000000001');
SAVEPOINT IN3;
INSERT INTO orders
VALUES(20013,
		 NULL,
		 '1000000003');
ROLLBACK TO IN1; -- MySQL最后不需要再添加 commit transaction

主键Primary Key
简单的陈列一些主键的性质:
任意两行的主键值各不相同
每行都具有一个主键值(不允许null)
包含主键值的列从来不会更新或者修改
主键值不能重用

需要注意的是,每张表中都只能有一个主键
这一个主键可以是单独的一行,也可以是多行构成的联合主键

外键Rerferences Key
外键是表中的一列,其值必须在另一表的主键中
外键可以保证引用的完整性

下面举一个生动形象的例子:
Orders表中是录入到系统中的每个订单,Customers存储着所有的顾客信息
Orders表中的顾客ID与Customers表中的特定的顾客ID行相关联
顾客ID是Customer表中的主键

在Orders表中顾客ID列上定义一个外键,该列只能接受Customers表中主键值

REFERENCES Customers(cust_id)

唯一约束
唯一约束用来保证一列或者是一组列中的数据是唯一的

剩下的还有非空约束以及检查性约束

戳这里看五大约束------->数据库的五大约束wu

综上所述:这些约束可以保证数据库的安全性(防止误伤数据,避免数据库中数据出现重复或者遗漏)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值