mysql平时用得不多 最近做的项目里面数据库操作很多 遇到一些实用的操作 记录一下
create table havenot_topup20140925
(
SELECT DISTINCT vc_mobile as number FROM npn_account_bind WHERE ti_type = '2'
AND vc_mobile NOT IN
(
SELECT DISTINCT vc_mobile FROM npn_account_bind WHERE ti_type = '2'
AND vc_account IN
(
SELECT DISTINCT vc_account FROM npn_hsbc
)
)
)
这是同事写的代码,我以前没这么用过,
这样创建一个临时表,这个表只有数据,没有主键索引之类的东西 用完我们要手动删除
使用上我们称之为临时表 其实在mysql中临时表是这么定义的
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
这样定义的临时表在断开数据库后会自动销毁
如果有两个表需要合并 a表有10个字段 b表只有5个字段 b表中的字段a表都有 a表中除了这五个字段其他字段可以为null
合并完全没有问题是吧
我第一次这样写的:
insert into a ( select * from b )
它会提示你两个表字段不匹配,正确的写法是这样做的:
insert into a (c1,c2,c3,c4,c5) ( select c1,c2,c3,c4,c5 from b )
</pre><p></p><p></p>接下来是一个最坑爹的事情:<p>我要把远程一个数据库db的a表导到本地 ,直接在mysql命令行下面操作了一下还ok</p><p>最后我要用php执行这句话的时候就遇到各种不快了</p><p>ps:下面的代码是php写的 其他语言都会有 一个类似exec的函数去执行系统的shell命令</p><p></p><pre code_snippet_id="554318" snippet_file_name="blog_20141217_6_4911625" name="code" class="php">system('E:/UinServer/UniServer/usr/local/mysql/bin/mysqldump.exe -h203.23.123.33 -P3306 -uroot -p"abc!@#$%^" db a > a.sql',$rt) ;
if ( $rt != 0 ) die( "导出数据表失败 " ) ;
看一下容易出错的地方,如果安装mysql添加了path环境变量的都知道打开cmd直接输入mysqldump就有效,我也是这样的,但是!!!
放到程序里面一定要把mysqldump.exe的路径写出来,我刚开始就没写,半天不知道哪里错了
第二个问题,有没有发现我的密码中又特殊字符,我把上面执行的语句直接放大mysql命令行中执行,error报错 说我密码错误,我就把密码取消了 等回车在输入密码
正确,没问题,密码中的特殊字符在cmd中我不知道起到了什么作用 ,但是肯定有干扰,于是我加上了单引号,奇迹发生了 还是报错 密码错误 这些我懵了
然后问公司的同事 都没有解决 我无意中把单引号改成了双引号 尼玛 windows就是个奇葩
windows上折腾了一番还不算,服务器是linux的 本地测好了还要到服务器上测试一下:
system('/var/www/mysqldump -h203.23.123.33 -P13306 -uroot -p'abc!@#$%^' db a> a.sql',$rt) ;
if ( $rt != 0 ) die( "导出数据表失败 " ) ;
眼力2.0人已经发现两个写法有些不同了 下面来看 为什么 why:
首先打开shell 首先把语句放进去跑一下
mysqldump -h203.23.123.33 -P13306 -uroot -p"abc!@#$%^" db a> a.sql
====bash @#$%^ is not found 大概意思就是把感叹号后面的东西作为bash指令了,
我这次很机灵 马上把双引号换成单引号 因为我知道双引号在shell里面会被解释
ok 完美通关
开始把代码放到php里面去,首先mysqldump的路径是要变换的 在linux中可执行文件很多都是没有后缀的
不要自作聪明在后面加个.exe , 好 路劲我改好了 运行没效果,在php里面把命令输出来 复制到shell命令行下面能执行
但是为啥子在php中就不行了呢 开始谷歌了 不经意间发现 权限 两个字 马上想起来 mysqldump在目录/usr/bin下面
php作为apache的一个模块没有权限访问这个目录,解决方法就是用root管理员账号登陆系统 把mysqldump复制到一个普通用户可访问的目录,
我这里复制到了/var/www目录 还要把权限设置为0755
回到程序中执行 代码开始执行