今天早上你遇到一个问题
连不上服务器了
好不出来
你决定登录自己的数据库
打开用户登陆界面你发现自己不知道密码,使用默认密码也登陆不上
失败码是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
综上所述:这些约束可以保证数据库的安全性(防止误伤数据,避免数据库中数据出现重复或者遗漏)