mysql如何用一条sql语句实现不存在就插入,存在的话则更新

今天被朋友问到一个问题,在用SQL对mysql进行操作时,如何用一条sql实现不存在则插入,存在则更新(存在是针对主键或者unique来说的)。说实话,以前比较懒,每次都直接在程序中写一个if...else...,不免觉得代码太丑陋,而且在性能上也不好。因此对这个问题跟朋友进行了深入的讨论,加上网络上的资料,对这个问题进行了一个总结。假定我们有如下的一张表,id是主键。

 FieldType 
 idint(11) 
 namevarchar(20) 
 isForStinyint(1) 
 moneyint(11)

create table
CREATE TABLE `ceshi` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(20) DEFAULT NULL,
   `isForS` tinyint(1) DEFAULT NULL,
   `money` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
表中有如下数据。
idnameisForSmoney
4ddd1200
3zhangsan0300
2lisi0200
1zhangsan1201

1.使用replace

REPLACE INTO ceshi(id,NAME,isForS,money) VALUES(1,"zhangsan",1,100),当执行这条命令是由于数据库中已经存在了该条数据(id主键重复),所以数据库中的数据没有改变。实际上当数据库中不存在要插入的数据时,replace跟insert语句具有同样的效果。而当数据库中有已经存在的数据行时,mysql先把以前的记录删除掉,接着再执行insert.

2.使用dual虚拟表

当我们在mysql中输入命令select 1+1时,实际上就是select 1+1 from dual。dual这个表不过是让你的sql语句写起来更符合传统的sql语句的格式。我们可以这样来写我们的sql语句,INSERT INTO ceshi SELECT 1,"zhang",0,200 FROM DUAL WHERE NOT EXISTS (SELECT * FROM ceshi WHERE id=1) 。

3.使用ON DUPLICATE KEY UPDATE

执行如下的sql语句,INSERT INTO ceshi VALUE(1,"zhang",1,100) ON DUPLICATE KEY UPDATE money=money+100

如果数据库中不存在id为1的记录,则相当于执行INSERT INTO ceshi VALUE(1,"zhang",1,100),此时返回的受影响的行数为1.

如果数据库中存在相应的记录,相当于执行update ceshi set money=money+100 where id=1.此时返回的受影响的行数为2.

4.使用ignore关键字

INSERT IGNORE INTO ceshi VALUE(1,"zhang",1,100),当执行这条sql语句时,如果数据库中已经存在相同的记录,则数据库会忽略该条命令,返回的受影响的行数为0.


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值