通常情况下,我们会使用以下SQL语句来更新字段值:
UPDATE mytable SET myfield='value' WHERE other_field='other_value';
但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源、教程指南、橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录。如果我想重新编排这些分类目录的顺序,例如改成(教程指南、橱窗展示、免费资源),这时就需要更新categories表相应行的display_order字段,这就涉及到更新多行记录的问题了,刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的php程序示例:
foreach ($display_order as $id => $ordinal) { $sql="UPDATE categories SET display_order = $ordinal WHERE id = $id"; mysql_query($sql); }
这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。幸运的是,还有更好的解决方案,只不过SQL语句稍微复杂点,但是只需执行一次查询即可,语法如下:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
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
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
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)中,添加下面一行。
log-bin = mysql-bin
我这里没有指定存放路径,默认会存放在mysql的数据存放目录,所有的二进制文件都以mysql-bin开头,当然你也可以自己指定mysql bin-log的存放路径和名称。
保存mysql的配置文件,重启mysql
MySQL 赋予用户权限命令的简单格式可概括为:
grant 权限 on 数据库对象 to 用户
grant select, insert, update, delete on testdb.* to user@'%'
grant create,alter,drop on testdb.* to user@'192.168.0.%';
grant references on testdb.* to user@'192.168.0.%';
grant create temporary tables on testdb.* to user@'192.168.0.%';
grant index on testdb.* to user@'192.168.0.%';
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.%';
grant all privileges on testdb to user@'localhost'
今天我的一个域名到期了,可是图片的url地址在mysql中存储的还是之前用的那个域名,造成等图片正常显示,想到用mysql的批量替换,将原来的域名替换成现在的域名。用到了下面的mysql命令
UPDATE 表名 SET 字段 = REPLACE(字段,'待替换内容','替换值');
上张图片
UPDATE notes SET note_content=REPLACE(note_content, '51makeit', 'keepdoit' );
再看下面的一个例子:
想讲title中的“第*讲:”去掉,可以用到这个命令
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;