读一读

Navicat For Mysql有14天的免费使用期,完全足够的将一个数据库拷贝下来了。

一、在目标服务器上安装Navicat For Mysql,然后远程连接到数据源服务器。

二、使用备份功能,将大点的数据库分批导出(函数和事件,表和数据,筛选抛弃无用数据),然后在提取sql;小的数据库直接右键转存为sql就行了。

三、使用Navicat For Mysql链接本地数据库,创建相应编码的数据库(一定在导入前指定,试过在导入后修改,报Incorrect string value错误),运行二步骤导出的sql。

四、如果报错,细分数据库备份导出,好区分错误,同时也减少错误。


this function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de


解决办法就是运行语句

set global log_bin_trust_function_creators=TRUE;

alter table chicai_enemy add lv int;
update chicai_enemy set lv = level;
alter table chicai_enemy drop column level;
alter table chicai_enemy change lv level int not null primary key;

以前的自增长主键为level,通过新加字段,复制数据,删除原有主键,重命名新加字段来达到取消自增长


今天测试了对分区表的插入情况,对分区表插入100W条数据,执行了很久存储过程还在处理中,且查询数据,且发现只插入了2W条,等了很久才增加到3W条。

后面我测试了对没有分区的表进行插入100W条数据,以秒记的时间就完成全部插入了。

是分区表会影响大量数据的插入,还是我使用的姿势不对,网上也没找到答案。


alter table manydate PARTITION BY RANGE(id)(
    PARTITION p0 VALUES less than (200000),
    PARTITION p1 VALUES less than (500000),
    partition p2 VALUES less than (800000),
    PARTITION p3 VALUES less than (1000000),
    partition p4 values less than MAXVALUE
)



insert ignore INTO manydate(fid,name,create_at) VALUES(1,'hello','2018-3-21')

使用ignore关键字,如果这行数据的自增值被使用了,不会抛出Duplicate entry 'id' for key 'PRIMARY'的错误,直接返回影响的行数为0,同时将自增值指向下一个。


有时候需要自定义主键ID,mysql系统给予一个自增ID,是可以修改它为其他不存在的id的。

如果你修改到比当前自增值高的值时,mysql下次自增长到这个值时就会报“Duplicate entry 'id' for key 'PRIMARY'”,然后偷偷的将自增值再指向下一个了,所以,当你再次Insert的时候就不会出错了。

注意,如果你是指定主键id的Insert,并且这个id比当前自增值高,那么就会照成下一个自增值为你当前值的下一个。

注意,用update的方式只是暂时不会影响自增值,但是重启数据库后,那么自增值就会由最大值的下一位开始了!


  1. 先在服务中关闭Mysql服务。

  2. 将源目录数据(C:/ProgramData/.../Data/)下的所有数据复制到你要更改的地方(D:/Mysql/Data/)

  3. 修改源目录的配置文件my.ini,找到datadir,修改为你要更改的地方

  4. 重新启动服务,如果失败,给你要更改的目录(D:/Mysql/Data/)的Data添加上NETWORK SERVICE用户的读写改权限。


在mysql5.7中,如果对datetime类型的字段设置为not null但是没有给予数据时,默认就会为:"0000-00-00 00:00:00"

但是用这个字段做order by时,就会出现错误,解决办法就是更改这些0数据,再设置字段默认值为基于一个日期不全为0的值

还有就是可以解除这种限制,通过查看

select @@sql_mode

查看到:

NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零 
NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

去掉这两个,应该也可以,没试。


今天想弄一个分类复习笔记,根据笔记类型来分配每天复习的比例,每种类型又按复习时间来排序,所以写下这个sql

UPDATE chicai_note INNER JOIN chicai_note_book ON chicai_note.relate_id = chicai_note_book.id INNER JOIN chicai_note_folder ON chicai_note_book.relate_id = chicai_note_folder.id 
SET chicai_note.isn_review = 0 WHERE chicai_note_folder.id = 6 ORDER BY chicai_note.review_at LIMIT 10

结果错误了,Incorrect usage of UPDATE and ORDER BY,看来这个Order By是有限制的

解决办法就是先select处理标记的id再和需要update的表联合,这就是只有一个联合,不存在Order By了

UPDATE chicai_note note INNER JOIN 
(select n.id from chicai_note n INNER JOIN chicai_note_book ON n.relate_id = chicai_note_book.id INNER JOIN chicai_note_folder ON chicai_note_book.relate_id = chicai_note_folder.id WHERE n.user_id=1 AND chicai_note_folder.id = 1 ORDER BY n.review_at LIMIT 10) 
AS temp ON note.id=temp.id SET note.isn_review = 1;

这是我写过最长的sql了,哈