通常情况下,我们会使用以下SQL语句来更新字段值:
1 | UPDATE mytable SET myfield= 'value' WHERE other_field= 'other_value' ; |
但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源、教程指南、橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录。如果我想重新编排这些分类目录的顺序,例如改成(教程指南、橱窗展示、免费资源),这时就需要更新categories表相应行的display_order字段,这就涉及到更新多行记录的问题了,刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的php程序示例:
1 2 3 4 | foreach ( $display_order as $id => $ordinal ) { $sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id" ; mysql_query( $sql ); } |
这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。幸运的是,还有更好的解决方案,只不过SQL语句稍微复杂点,但是只需执行一次查询即可,语法如下:
1 | select id from t where num is null |
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
1 | select id from t where num=0 |
1 | select id from t where num=10 or num=20 |
可以这样查询:
1 2 3 4 5 | select id from t where num=10 union all select id from t where num=20 |
1 | select id from t where num in (1,2,3) |
对于连续的数值,能用 between 就不要用 in 了:
1 | select id from t where num between 1 and 3 |
1 | select id from t where name like '%abc%' |
若要提高效率,可以考虑全文检索。
Bin-Log日志以一种更有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。
Bin-Log日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。
注释:Bin-Log日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用。
Bin-Log日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果你想要记录所有语句(例如,为了识别有问题的查询),你应使用一般查询日志。
Bin-Log日志的主要目的是在恢复使能够最大可能地更新数据库,因为Bin-Log日志包含备份后进行的所有更新。
Bin-Log日志还用于在主复制服务器上记录所有将发送给从服务器的语句
在mysql的配置文件(my.cnf)中,添加下面一行。
1 | log-bin = mysql-bin |
我这里没有指定存放路径,默认会存放在mysql的数据存放目录,所有的二进制文件都以mysql-bin开头,当然你也可以自己指定mysql bin-log的存放路径和名称。
保存mysql的配置文件,重启mysql
MySQL 赋予用户权限命令的简单格式可概括为:
1 | grant 权限 on 数据库对象 to 用户 |
1 | grant select, insert, update, delete on testdb.* to user@ '%' |
1 | grant create , alter , drop on testdb.* to user @ '192.168.0.%' ; |
1 | grant references on testdb.* to user @ '192.168.0.%' ; |
1 | grant create temporary tables on testdb.* to user @ '192.168.0.%' ; |
1 | grant index on testdb.* to user @ '192.168.0.%' ; |
1 2 3 | grant create routine on testdb.* to user @ '192.168.0.%' ; grant alter routine on testdb.* to user @ '192.168.0.%' ; grant execute on testdb.* to user @ '192.168.0.%' ; |
1 | grant all privileges on testdb to user @ 'localhost' |
今天我的一个域名到期了,可是图片的url地址在mysql中存储的还是之前用的那个域名,造成等图片正常显示,想到用mysql的批量替换,将原来的域名替换成现在的域名。用到了下面的mysql命令
1 | UPDATE 表名 SET 字段 = REPLACE (字段, '待替换内容' , '替换值' ); |
上张图片
1 | UPDATE notes SET note_content= REPLACE (note_content, '51makeit' , 'keepdoit' ); |
再看下面的一个例子:
想讲title中的“第*讲:”去掉,可以用到这个命令
1 2 | SELECT id,kid,title FROM `ke_classroom` WHERE kid=148; # update ke_classroom set title = replace (title, title, substring (title, locate( ':' , title)+1)) WHERE kid=148; |