MySQL中的insert ignore into, replace into, insert select, on duplicate key update的用法小结

在MySQL中进行条件插入数据时,可能会用到以下语句,现小结一下。我们先建一个简单的表来作为测试:

CREATE TABLE `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `NewIndex1` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert ignore into

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

insert ignore into books (name) values ('MySQL Manual')

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

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)

replace into

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

replace into books SELECT 1, 'MySQL Manual' FROM books

Redis在Windows下的安装配置及Python调用

Redis是一个Key-Value数据库,优点是简单,高效,稳定;缺点是所有数据存放于内存(会定期dump到磁盘),当然内存小时可以配置虚拟内存,不过性能会有所下降。 官方只提供源代码下载,并且不支持Windows,可从第三方下载Windows下的预编译文件,下载地址:

https://github.com/dmajkic/redis/downloads

解压后,所有命令均在一个目录下,服务器端直接运行redis-server.exe即可,如果需要特殊配置,可以指定配置文件或者使用redis-client进行配置。配置文件其实就是配置命令的一个集合。redis的配置命令(2.2之后)可以做到在不重启服务的情况下生效,包括redis版本更新,slave转为master等等。

Redis的Python接口目前比较成熟的是redis-py,项目地址为https://github.com/andymccurdy/redis-py,通过git可将源码下载到本地,git的安装和使用请参考[《Git使用123》](http://www.lunny.info/html/2011/01/24/625330.html)。

git clone https://github.com/andymccurdy/redis-py.git
cd redis-py
python setup install

redis-py的使用请参考https://github.com/andymccurdy/redis-py

一个Python函数:执行MySQL的SQL文件

有些时候,我们需要通过python来执行SQL文件,那么这个函数就有用武之地了。调用之前确保安装了mysql。Linux和Windows应该是都可以用的,Linux下没有测试过。

from subprocess import Popen, PIPE

def excSQLFile(host, db, user, passwd, charset, filename):
    process = Popen('mysql -h%s -D%s -u%s -p%s --default-character-set=%s' \
        % (host, db, user, passwd, charset),
        stdout=PIPE, stdin=PIPE, shell=True)
    output = process.communicate('source ' + filename)[0]
    return output

在输入框/搜索框中显示提示文字的JS效果

我敢说,做前端的十个里八个做过这个。今天把我的做法记录一下哈,直接上代码:

function trim(str){
    return str.replace(/^\s*(.*?)[\s\n]*$/g,'$1')
}
var ic = false
function a(){return document.getElementById("a")}

function cha() {return trim(a().value).length > 0}

function ifblur() {
    ic = cha()
    if (!ic) {
        a().value = "我是提示文字"
         a().style.color = "gray"
     }
 }

function iffocus() {
     if (!ic) {
         a().value = ""
         a().style.color = "black"
         ic = true
     }
}