mysql 常用脚本整理

MySQL 来自各种资源 及部分自己实践


添加字段
ALTER TABLE 表名 ADD COLUMN 列名 类型 comment '说明'
ALTER TABLE User ADD COLUMN shorName varchar(30) comment '小名'

修改字段 长度或字段 类型
ALTER TABLE 表名 MODIFY COLUMN 列名 类型 comment '说明'
ALTER TABLE User MODIFY COLUMN shorName varchar(40) comment '小名'


修改字段 名称
ALTER TABLE 表名 CHANGE COLUMN 列名 类型 comment '说明'
ALTER TABLE User CHANGE COLUMN shorName shorName2 varchar(40) comment '小名'

查询字段长度
SELECT LENTH('fdsafdsa')

删除数据库表名
DELETE FROM table1 WHERE
TRUNCATE TABLE table1 WHERE
DELETE p from bd_person_info p ,(select b.code,b.name from bd_person_info b group by b.code,b.name having count(b.code)>1) t  where p.code = t.code and p.name = t.name

查询结果到临时表
CREATE TEMPORARY TABLE 临时表名(temp_table)
SELECT *
FROM 表名

多表关联更新数据
UPDATE table11,table2 SET table11.code=table2.pcode
WHERE table2.id=table11.pid;

UPDATE authors
SET state = 'ZZ'
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id

UPDATE a inner join b on a.id = b.aid set a.name='改掉' where b.code='条件';

-- 更新子科目的pgenecode(仅支持二级科目)
UPDATE bd_subject_info u,
 (
    SELECT t.`code`, t.genecode
    FROM bd_subject_info t
    WHERE LENGTH(t.`code`) = 4 -- 父编号长度
) AS p
SET u.pgenecode = p.genecode
WHERE LENGTH(u.`code`) = 6 -- 下一级编号长度
AND p.`code` = SUBSTRING(u.`code`, 1, 4); -- 从下级编号截取父编号的长度


select * from Customer LIMIT 10;--检索前10行数据,显示1-10条数据
select * from Customer LIMIT 1,10;--检索从第2行开始,累加10条id记录,共显示id为2....11
select * from Customer limit 5,10;--检索从第6行开始向前加10条数据,共显示id为6,7....15
select * from Customer limit 6,10;--检索从第7行开始向前加10条记录,显示id为7,8...16

字段默认时间设置为CURRENT_TIMESTAMP时,当前行任意字段发生改就,即会更新此字段的时间

1.insert ignore into

当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。例如:

INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')

2.on duplicate key update

当primary或者unique重复时,则执行update语句,如update后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉。例如,为了实现name重复的数据插入不报错,可使用一下语句:

INSERT INTO books (name) VALUES ('MySQL Manual') ON duplicate KEY UPDATE id = id

3.insert … select … where not exist

根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。例如:

INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

4.replace into

如果存在primary or unique相同的记录,则先删除掉。再插入新记录。

REPLACE INTO books SELECT 1, 'MySQL Manual' FROM books

故障案例---innodb表出现大量的Waiting for table level lock
https://blog.csdn.net/cug_jiang126com/article/details/73549960

3. 如何提高insert的性能?
答:有如下方法:
     a)合并多条 insert 为一条,即: insert into t values(a,b,c),  (d,e,f) ,,,
       原因分析:主要原因是多条insert合并后日志量(MySQL的binlog和innodb的事务让日志) 减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。
     b)修改参数 bulk_insert_buffer_size, 调大批量插入的缓存;
     c)设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度;
      (备注:innodb_flush_log_at_trx_commit 参数对 InnoDB Log 的写入性能有非常关键的影响。该参数可以设置为0,1,2,解释如下:
    0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file  的刷新或者文件系统到磁盘的刷新操作;
    1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;
    2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
        )

      d)手动使用事务
           因为mysql默认是autocommit的,这样每插入一条数据,都会进行一次commit;所以,为了减少创建事务的消耗,我们可用手工使用事务,即START TRANSACTION;insert 。。,insert。。 commit;即执行多个insert后再一起提交;一般1000条insert 提交一次。

猜你喜欢

转载自blog.csdn.net/lwbjyl/article/details/80902188
今日推荐