mysql update语句

MySQL学习笔记(3)

北慕城南 提交于 2020-03-24 17:42:58
MySQL通常有这几种约束: 主键 默认值 唯一 外键 非空 PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL 触发器的创建 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 不能同时存在具有相同触发程序动作时间和事件的某个表。如,对于某一个表,不能有两个BEFORE UPDATE触发程序。 trigger_stmt是当触发程序激活时执行的语句。如果执行多个语句,使用BEGIN ... END复合语句结构。 触发器的删除 DROP TRIGGER [schema_name.]trigger_name 视图的创建 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 关于视图处理算法Algorithm,是对标准SQL的MySQL扩展,可以取三个值UNDEFINED | MERGE | TEMPTABLE,若无Algorithm默认是UNDEFINED

mysql查询优化笔记

与世无争的帅哥 提交于 2020-03-24 14:20:08
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:   select id from t where num is null   可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:   select id from t where num=0 3、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4、应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:   select id from t where num=10 or num=20   可以这样查询:   select id from t where num=10   union all   select id from t where num=20 5、in 和 not in 也要慎用,否则会导致全表扫描,如:   select id from t where num in(1,2,3)   对于连续的数值,能用 between 就不要用 in 了:   select id from t where num between 1 and 3 6

binlog2sql之MySQL数据闪回实践

吃可爱长大的小学妹 提交于 2020-03-24 06:41:01
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚。传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据。此法费时费力,甚至需要停机维护,并不适合快速回滚。也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能。现在有不少好用而且效率又高的开源闪回工具如binlog2sql、mysqlbinlog_flashback,这些工具在工作中给DBA减轻了不少痛苦,以下针对binlog2sql的使用进行实践演练。 binlog2sql的用途: 数据快速回滚(闪回) 主从切换后数据不一致的修复 从binlog生成标准SQL,带来的衍生功能 安装binlog2sql前先安装git和pip: yum -y install epel-release yum -y install git python-pip 安装binlog2sql: git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql pip install -r requirements.txt MySQL的配置要开启以下选项: [mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog

一条update语句的执行过程

别说谁变了你拦得住时间么 提交于 2020-03-24 01:56:28
3 月,跳不动了?>>> 以前有过一篇关于 MySQL查询语句的执行过程 ,这里总结一下update语句的执行过程。由于update涉及到数据的修改,所以,很容易推断,update语句比select语句会更复杂一些。 1,准备 创建一张test表 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) NOT NULL DEFAULT '0' COMMENT '数值', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表'; 插入三条数据 INSERT INTO `test` (`c`) VALUES (1), (2), (3); 2,测试 加入我要把第一条数据的 c 值 加 1,则 UPDATE `test` SET `c` = `c` + 1 WHERE `id` = 1; 按照我们平常的思路,就是找出这条记录,把它的值改好,保存就OK了。 但我们追究一下细节,由于涉及到修改数据,所以涉及到日志了。 3 操作顺序 3.1 查找记录:执行器先找引 擎取 id=1这一行。ID是主键,引擎直接用树搜索找到这一行。如果id=1这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存

MySQL——pymysql的使用

筅森魡賤 提交于 2020-03-23 19:46:34
MySQL——python对mysql操作 pymysql 模块 # 1.模块的安装:pip install pymysql 或者进入setting # 2.代码连接 import pymysql # 连接 conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password='', database="day41", charset = "utf8" ) # 游标操作 cursor = conn.cursor()# 默认以元组的形式返回是返回 # cursor = conn.cursor(pymysql.cursors.DictCursor)# 参数规定以字典形式返回 3.对数据库的操作 res = cursor.excute('select * from class') # 发送指令到mysql print(res) # 查询到数据的总调条数不是所有详细信息(rows) print (cursor.fetchone()) # 获取一个查询的结果,同时游标往后移动一个 print (cursor.fetchone()) cursor.scroll(1,"absloute") # 绝对位置,参照开始位置1 # cursor.scroll(1,"relative") # 相对位置 print

MySQL 数据定义语言(DDL)

房东的猫 提交于 2020-03-23 18:05:46
SQL 包含以下 4 部分: 1 数据定义语言(DDL):DROP、CREATE、ALTER 等语句。 2 数据操作语言(DML):INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。 3 数据查询语言(DQL):SELECT 语句。 4 数据控制语言(DCL): GRANT、REVOKE、COMMIT、ROLLBACK 等语句。 MySQL之DDL(Data Definition Language): 数据定义语言:CREATE,ALERT,DROP等 DDL:操作数据库,表(CRUD) 1.操作数据库 (1)C(Create):创建数据库 CREATE DATABASE [IF NOT EXISTS] 数据库名 [[DEFAULT] CHARACTER SET 字符集名] [[DEFAULT] COLLATE 校对规则名]; eg. mysql> CREATE DATABASE IF NOT EXISTS test -> DEFAULT CHARACTER SET utf8 -> DEFAULT COLLATE utf8_general_ci; Query OK, 1 row affected, 1 warning (0.01 sec) (2)R(Retrieve):查询 SHOW DATABASES [LIKE '数据库名']; eg.查询全部 mysql>

MYSQL存储过程实现in传入参数 where in('1','2')

柔情痞子 提交于 2020-03-23 13:09:38
android 服务器端开发中遇到这么一个问题: 突然发现将字符串传入到存储过程,参数为 '1','2' ,竟然执行无效 所以看到网上有在存储过程中直接拼凑sql的代码,今天也试了一下,可以执行了,代码如下: CREATE DEFINER = 'abc'@'%' PROCEDURE ConfirmAcceptorListProc(in p_task_id varchar(20),in p_user_ids text,out p_msgtype varchar(20),out p_msg varchar(20)) begin DECLARE m_user_ids varchar(1000); DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; SET @SEL='update go_task_acceptor set status =\'2\' where status = \'1\' AND task_id = \''; set @sentence = concat(@sel,p_task_id,'\' AND acceptor_id in (',p_user_ids,');'); -- 连接字符串生成要执行的SQL语句 prepare stmt

理解MySQL——架构与概念

我的梦境 提交于 2020-03-23 12:10:40
写在前面:最早接触的MySQL是在三年前,那时候MySQL还是4.x版本,很多功能都不支持,比如,存储过程,视图,触发器,更别说分布式事务等复杂特性了。但从5.0(2005年10月)开始,MySQL渐渐步入企业级数据库的行列了;复制、集群、分区、分布式事务,这些企业级的特性,使得现在的MySQL,完全可以应用于企业级应用环境(很多互联网公司都用其作为数据库服务器,尽管节约成本是一个因素,但是没有强大功能作后盾,则是不可想象的)。虽然,MySQL还有很多不足,比如,复制、分区的支持都十分有限、查询优化仍需要改进,但是MySQL已经是一个足够好的DBMS了,更何况它是opensource的。这段时间没有事,出于好奇,略微的研究了一下MySQL,积累了一些资料,欲总结出来。这些资料打算分为两部分,上部主要讨论MySQL的优化,其中主要参考了《MySQL Manual》和《High Performance MySQL》,如果有时间,以后在下部分析一下MySQL的源码。如果你是MySQL高手,希望你不吝赐教;如果你是新手,希望对你有用。 第一章、MySQL架构与概念 1、MySQL的逻辑架构 最上面不是MySQL特有的,所有基于网络的C/S的网络应用程序都应该包括连接处理、认证、安全管理等。 中间层是MySQL的核心,包括查询解析、分析、优化和缓存等。同时它还提供跨存储引擎的功能

mysql数据库面试总结

喜你入骨 提交于 2020-03-23 04:59:04
数据库优化 建表优化 1)数据库范式 l 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 如电话列可进行拆分---家庭电话、公司电话 l 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 l 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。 比如 Student 表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号 --> 所在院校 --> ( 院校地址,院校电话 ) 这样的表结构,我们应该拆开来,如下。 (学号,姓名,年龄,性别,所在院校) -- (所在院校,院校地址,院校电话) 满足这些规范的数据库是简洁的、结构明晰的;同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。 2)数据类型选择 l 数字类型 Float 和 double 选择(尽量选择 float ) 区分开TINYINT / INT / BIGINT,能确定不会使用负数的字段,建议添加 unsigned定义 能够用数字类型的字段尽量选择数字类型而不用字符串类型的 l 字符类型 char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用

MySQL学习(5)

血红的双手。 提交于 2020-03-21 09:35:29
三 触发器   对某个表进行某种操作欠货(如:增删改查),希望触发某个动作,可以使用触发器。   1.创建触发器 create trigger trigger1_before_insert_tb1 before insert on tb1 for each row begin ... endbefore可以换成after, insert可以换成delete,update.      在想tb1插入数据后,tb2结果:      触发器获得用户提交的数据: create trigger tri_after_insert_tb1 after insert on tb1 for each row begin NEW.nid (为用户新提交过来的 tb1.nid的值) NEW.name(为用户新提交过来的tb1.name的值) insert into tb2(num) values(NEW.nid); end create trigger tri_after_delete_tb1 after delete on tb1 for each row begin OLD.nid (为删除的tb1.nid的值) OLD.name(为删除的tb1.name的值) insert into tb2(num) values(OLD.nid); end create trigger tri_after