(转)MySQL数据表中记录不存在则插入,存在则更新/不操作

本文转自https://blog.csdn.net/lycloud/article/details/24932961   ,对原作者的辛勤付出表示感谢,本文仅做记录,方便以后自己查阅!

我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录。有不同的方法可以完成这一逻辑。

 1. 通过两条SQL语句

  1. SELECT COUNT(*) FROM xxx WHERE ID=xxx;  
  2.   
  3. if (x == 0)  
  4.     INSERT INTO xxx VALUES;  
  5. else  
  6.     UPDATE xxx SET ;  

2. 运用 INSERT IGNORE语句

官方文档如下:

MySQL provides many extentions to SQL which help performance in many common use scenarios. Among these are INSERT ... SELECTINSERT ... ON DUPLICATE KEY UPDATE, and REPLACE.

I rarely hesitate to use the above since they are so convenient and provide real performance benefits in many situations. MySQL has other keywords which are more dangerous, however, and should be used sparingly. These includeINSERT DELAYED, which tells MySQL that it is not important to insert the data immediately (say, e.g., in a logging situation). The problem with this is that under high load situations the insert might be delayed indefinitely, causing the insert queue to baloon. You can also give MySQL index hints about which indices to use. MySQL gets it right most of the time and when it doesn't it is usually because of a bad scheme or poorly written query.

重要的就是上面提到的 :

INSERT ... SELECT

INSERT ... ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE REPLACE

比如想往表中插入一条数据,如果表中没有该条数据才插入,如果已经存在该条数据就不插入。

首先,在创建表时,将不需要重复的字段设置为unique,然后在插入时,使用insert ignore语句。

例如:(数据库用的是mysql5)
创建一张表用来存储用户并插入数据:

  1. create table user_info  
  2. (  
  3.    uid mediumint(10) unsigned NOT NULL auto_increment primary key,  
  4.    last_name char(20) not null,  
  5.    first_name char(20) not null,  
  6.    unique ( last_name, first_name)  
  7. );  
  8. alter table anser add UNIQUE (last_name,first_name)  
  9. insert ignore into user_info (last_name,first_name) values ('x','y');  

这样一来,如果表中已经存在last_name='x'且first_name='y'的数据,就不会插入,如果没有就会插入一条新数据。


3. 运用 INSERT…SELECT方法

示例一:插入多条记录 
假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:

  1. INSERT INTO clients   
  2. (client_id, client_name, client_type)   
  3. SELECT supplier_id, supplier_name, 'advertising'   
  4. FROM suppliers   
  5. WHERE not exists (select * from clients   
  6. where clients.client_id = suppliers.supplier_id);   

示例二:插入单条记录 

  1. INSERT INTO clients   
  2. (client_id, client_name, client_type)   
  3. SELECT 10345, 'IBM''advertising'   
  4. FROM dual   
  5. WHERE not exists (select * from clients   
  6. where clients.client_id = 10345);   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值