精华内容
下载资源
问答
  • MySQL重复执行的建表SQL
    2022-04-01 13:42:53

    记录一个可重复执行的建表SQL,因为有时候上线不是一次能成功的,所以需要考虑到重复执行。

    DROP TABLE
    IF
    	EXISTS table_name;
    CREATE TABLE `table_name` (
      `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `column1` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '变量代码',
      `column2` float DEFAULT NULL COMMENT '变量值',
      `column3` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '所属任务',
      `create_time` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=145 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

    更多相关内容
  • 很多公司都要求再生产上打得sql脚本允许反复执行(防止某一个sql报错以后要拎出来执行)。 所以就产生了需要先判断索引是否存在,再做添加索引或者删除索引的操作(若索引不存在,删除索引会报错) 这时候单独sql...

    很多公司都要求再生产上打得sql脚本允许反复执行(防止某一个sql报错以后要拎出来执行)。
    所以就产生了需要先判断索引是否存在,再做添加索引或者删除索引的操作(若索引不存在,删除索引会报错)
    这时候单独sql已经无法完成这个要求了(添加和删除索引的语句不支持IF EXISTS)
    所以需要存储过程出马,这么简单的存储过程很多人都会写,但是这里我踩了一个坑。。。
    没错,就是表名不能当参数。。。
    第一次写的存储过程,不幸的挂了。

    DROP PROCEDURE IF EXISTS add_index;  
    DELIMITER //
    CREATE PROCEDURE add_index(IN p_db_name VARCHAR (64),IN p_table_name VARCHAR (64),IN p_index_name VARCHAR (64),IN p_index VARCHAR (64)) BEGIN 
    IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema = p_db_name AND table_name = p_table_name AND index_name = p_index_name) THEN  
       ALTER TABLE p_table_name ADD INDEX p_index_name ( p_index );
    END IF;  
    END//  
    DELIMITER ;  
    

    这里 ALTER TABLE p_table_name ADD INDEX p_index_name ( p_index ); 这句话是错误的,因为存储过程里表名无法直接作为参数使用。
    还好,还可以使用MySQL提供的PREPARE语法
    关于PREPARE的具体使用方法,可以参考网址:https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html
    于是修改存储过程为

    DROP PROCEDURE IF EXISTS add_index;  
    DELIMITER //
    CREATE PROCEDURE add_index(IN p_db_name VARCHAR(64),IN p_table_name VARCHAR(64),IN p_index_name VARCHAR(64),IN p_index VARCHAR(64)) BEGIN 
    DECLARE StrAdd VARCHAR(250);
    DECLARE StrDrop VARCHAR(250);
    set @StrAdd=concat('ALTER TABLE ',p_table_name,' ADD INDEX ',p_index_name,'(',p_index,')');
    set @StrDrop=concat(' drop index ',p_index_name,' on ',p_table_name);   
    IF NOT EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema = p_db_name AND table_name = p_table_name AND index_name = p_index_name) THEN  
        PREPARE stmt FROM @StrAdd;  
        EXECUTE stmt ;  
    ELSE
        PREPARE stmt FROM @StrDrop;  
        EXECUTE stmt ; 
        PREPARE stmt FROM @StrAdd;  
        EXECUTE stmt ; 
    END IF;   
    END//  
    DELIMITER ;  
    

    参数(p_db_name 库名,p_table_name 表名,p_index_name 索引名,p_index 索引字段)
    set @StrDrop=concat(’ drop index ‘,p_index_name,’ on ',p_table_name);
    这句是拼接一个sql语句,然后 PREPARE stmt FROM @StrDrop; 执行该sql ,最后通过DEALLOCATE释放该Prepared Statements
    该过程可以实现先判断有无该索引,有则删除然后新增,没有则直接新增。

    展开全文
  • MySql数据库脚本规范(可重复执行的sql)前言介绍DDLCreateDropAlterDMLInsertDeleteupdate 前言 提交相关脚本到生产执行的数据库脚本一般要求可以反复执行,以此记录下相关脚本的重复执行的规范写法。 介绍 数据库...

    MySql数据库脚本规范(可重复执行的sql)

    前言

    提交相关脚本到生产执行的数据库脚本一般要求可以反复执行,以此记录下相关脚本的重复执行的规范写法。

    介绍

    数据库脚本一般分为:
    1.DDL(数据定义语言)操作对象是表,包含:Create、Drop、Alter
    2.DML(数据操控语言)操作对象是数据,包含:Insert、Delete、Update
    3.DCL(数据控制语言)操作对象是权限、用户,Grant、Revoke

    DDL

    Create

    DROP TABLE IF EXISTS `USER`;
    CREATE TABLE `USER` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `MOBILE` varchar(20) DEFAULT NULL COMMENT '手机',
      `NAME` varchar(20) DEFAULT NULL COMMENT '用户名',
      `PASSWORD` varchar(20) DEFAULT NULL COMMENT '密码',
      `IS_ENABLE` int(2) DEFAULT NULL COMMENT '是否有效 1有效 0无效',
      `CREATE_TIME` datetime DEFAULT NULL,
      `UPDATE_TIME` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
      `CREATE_BY` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '创建者,记录创建者信息',
      `LAST_UPDATE_BY` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '修改者,记录修改者信息',
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
    

    Drop

    DROP TABLE IF EXISTS `USER`;
    

    Alter

    CREATE PROCEDURE ADD_USER_ADDRESS()
    BEGIN
        IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS 
    							WHERE table_schema = 'wen' 
    							AND table_name = 'USER' 
    							AND column_name = 'ADDRESS')
    	THEN
    		ALTER TABLE `USER`
    		ADD COLUMN `ADDRESS` varchar(20) NULL COMMENT '用户住址' AFTER `UPDATE_TIME`;
    	END IF;
    END;
    CALL ADD_USER_ADDRESS;
    DROP PROCEDURE ADD_USER_ADDRESS;
    

    DML

    Insert

    DELETE FROM USER WHERE ID = 1;
    INSERT INTO `wen`.`USER` (`ID`, `MOBILE`, `NAME`, `PASSWORD`, `IS_DELETED`, `CREATE_TIME`, `LAST_UPDATE_TIME`, `CREATE_BY`, `LAST_UPDATE_BY`) 
    VALUES ('1', '15788888888', '言君', '123456', '2019-09-27 15:17:37', NULL, 'admin', 'admin');
    

    Delete

    数据库一般不建议也不允许进行物理删除

    update

    /*备份表与数据*/
    DROP TABLE IF EXISTS `USER_20190927`;/*第一次运行保留,后面删除*/
    CREATE TABLE USER_20190927 LIKE USER;
    INSERT INTO USER_20190927 SELECT * FROM USER;
    
    /*软删除2019-09-23前数据*/
    UPDATE USER
    SET IS_ENABLE = 0
    WHERE IS_ENABLE = 1
    AND CREATE_TIME < '2019-09-27 00:00:00'
    
    展开全文
  • 方案一:使用ignore关键字 ... 这样当有重复记录就会忽略,执行后返回数字0 还有个应用就是复制表,避免重复记录: 代码如下: INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`; 方案二:使用
  • 要查找重复数据,我们可以使用mysql里的having语句,如图。 执行这个语句后,我们可以看到现在的结果里显示的就是表中重复数据的字段。 要删除这些重复的数据,我们找出这些数据的ID,在select语句里,添加id字段...
  • 问题描述 首先,看一下我的表结构。 CREATE TABLE `coolq_qq_group_message_receiver` ( `id` int(11) NOT NULL AUTO_INCREMENT, `qq_group_number` varchar(12) NOT NULL COMMENT 'QQ群号码', ...
  • mysql存储过程中 下面是一个较常见的场景,判断表中某列是否存在某值,如果存在执行某操作 需要注意的是不能用if exists; exists可以在where后面或者在create object是使用,但是在if语句中不可以使用,只能用变通的...
  • MySQL 循环执行100次,随机0~10

    千次阅读 2019-04-29 18:38:29
    BEGIN declare i int; set i = 0; while i <100 do INSERT INTO test (test1) VALUES (FLOOR(RAND() * 11)); set i = i+1; end while; END

    在这里插入图片描述

    BEGIN
    	declare i int;
    	set i = 0;
    	while i <100 do
    
    	INSERT INTO test (test1)
    	VALUES (FLOOR(RAND() * 11));
    
    	set i = i+1;
    	end while;
    END
    
    展开全文
  • 业务中遇到要从表里删除重复数据的需求,使用了下面的方法,执行成功,大家可以参考使用
  • MySQL数据库中删除重复记录的方法总结[推荐]
  • 给大家分享的是当向数据插入数据时,判断字段是不是存在,存在执行更新操作,如果不存在就执行插入操作的方法,有需要的朋友们可以参考借鉴。
  • 本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE;接下来就分别看看这三种方式的处理办法。 IGNORE 使用ignore当插入的值遇到主键...
  • DROP PROCEDURE IF EXISTS add_tb_column; DELIMITER $$ CREATE PROCEDURE add_tb_column() BEGIN DECLARE CurrentDatabase VARCHAR(100); SELECT DATABASE() INTO CurrentDatabase; IF NOT EXISTS (SELECT 1 ...
  • 由于每次执行只删除重复数据的一条,需要重复执行,如果本轮没有数据被删就OK #!/bin/sh # delete all company's duplicate uid MYSQL_BIN_PATH=/data/mysql/server/mysql_3306/bin MYSQL_SOCK_PATH=/data/mysql/...
  • 1.背景用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作;如果没有存在,那么执行insert操作代码逻辑:if(oderid != null){//...
  • mysql表增加字段可重复执行

    千次阅读 2018-12-21 10:58:22
    -- ---------------------------- -- Procedure structure for add_table_columns -- ---------------------------- DROP PROCEDURE IF EXISTS `add_table_columns`; DELIMITER ;; CREATE PROCEDURE `add_table_col....
  • Mysql语句执行逻辑

    千次阅读 多人点赞 2022-02-28 19:55:39
    一条SQL查询语句执行流程 select * from table where Id=4 要弄懂这条语句做的事情,我们先看下mysql整个架构涉及的 分为客户端,server端以及存储引擎,存储引擎层负责数据的存储和提取,其架构模式是插件式的,...
  • MYSQL定时执行存储过程

    千次阅读 2021-03-04 00:08:37
    标注4: [ON COMPLETION [NOT] PRESERVE] ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被...
  • 由于环境部署会经常执行升级脚本,编写可重复执行的升级脚本就很重要。 基本思路是对表做操作前先判断表是否存在,对字段做操作前同样需要判断字段是否已经存在,避免脚本执行过程报错退出。下面基于脚本可重复执行...
  • 在系统部署时候经常有sql提交,然而像ddl,dml文件重复执行则会报错,此篇文章是在网上搜罗了一些的常见情况的解决方法。 一、dml中insert语句 ①在insert中加入where条件根据唯一性判断是否存在,例如 ...
  • 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)2、删除表中多余的...
  • MySQL执行引擎

    千次阅读 2020-06-01 21:01:16
    Mysql执行引擎 显示mysql中所有的执行引擎 可以使用 SHOW ENGINES 命令 可以查看Mysql的所有执行引擎我们 可以到 默认的执行引擎是innoDB 支持事务,行级锁定和外键 修改Mysql执行引擎 方法1:真接修改。 在...
  • MySQL中的SQL执行流程

    千次阅读 2022-03-12 13:23:30
    MySQL中的SQL执行流程 MySQL的查询流程 查询缓存:Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端;如果没有,如果进入到解析器阶段。需要说明的是,因为查询混窜往往效率不高,所以在...
  • 这样写的脚本可以重复执行,安全系数增高, 先判断表中是否有字段和索引,没有则增加,有则跳过。 DROP PROCEDURE IF EXISTS schema_change ; DELIMITER // CREATE PROCEDURE schema_change ( ) BEGIN ...
  • MySQL删除重复

    千次阅读 2019-11-20 11:39:18
    在数据库的操作中,经常会遇到有重复的数据,并且这些重复的行是没用的数据,需要删除。我做了一个测试表,如下: 苹果和香蕉有重复的。 删除重复行 1. 使用not in 删除重复行,SQL语句如下: DELETE FROM fruit_...
  • 需要执行的sql语句 */ END 我的示例为: 然后保存为该查询为update_temper1 二.使用Navicat创建一个事件 点击Navicat的事件->新建事件 在定义中调用之前保存的存储过程CALL func() 然后设置计划,也...
  • Mysql如何实现可重复

    千次阅读 2021-09-10 00:14:57
    首先对于mysql来说相信也并不陌生,mysql默认的事务的隔离级别是3,即可以实现可重复读,那mysql又是怎样实现可重复读的呢? 下边进行简单的介绍 这里就要提到了mvcc,即多版本并发控制 首先先来看一个事务的执行...
  • 文章目录一条SQL在MySQL中是如何执行的1、连接器2、查询缓存3、分析器4、优化器5、执行器6、bin-log归档 一条SQL在MySQL中是如何执行的 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括...
  • MySQL如何查询表中重复的数据

    万次阅读 2021-11-16 16:21:57
    文章目录一、查询重复记录二、总结 一、查询重复记录 例:查询员工表里出现重复姓名的记录 思路: 1、查看重复记录,首先要使用用分组函数(group by),再用聚合函数中的计数函数count(name)给姓名列计数,且使用...
  • ,该语句先判断mysql数据库中是否存在这条数据,如果不存在,则正常插入,如果存在,则忽略 INSERT INTO login (`name`, `password`) SELECT 'ganhuojun', 'password' FROM login WHERE NOT EXISTS( SELECT `name` ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 288,114
精华内容 115,245
关键字:

mysql 重复执行

mysql 订阅