`
hougechuanqi
  • 浏览: 72047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mysql sql不存在就更新

 
阅读更多

MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDATE语法,使得原本需要执行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句即可完成。

INSERT ... ON DUPLICATE KEY UPDATE,当插入的记录会引发主键冲突或者违反唯一约束时,则使用UPDATE更新旧的记录,否则插入新记录。

例如ipstats表结构如下:

CREATE TABLE ipstats (ip VARCHAR(15) NOT NULL UNIQUE,clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0');

原本需要执行3条SQL语句,如下:

IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {    UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';} else {    INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);}

而现在只需下面1条SQL语句即可完成:

INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;

注意,要使用这条语句,前提条件是这个表必须有一个唯一索引或主键。

再看一例子:
mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| uid   | int(11)     | NO   | PRI |         |       | 
| uname | varchar(20) | YES |     | NULL    |       | 
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from test;
+-----+--------+
| uid | uname |
+-----+--------+
|   1 | uname1 | 
|   2 | uname2 | 
|   3 | me     | 
+-----+--------+
3 rows in set (0.00 sec)

mysql> INSERT INTO test values ( 3,'insertName' )
    -> ON DUPLICATE KEY UPDATE uname='updateName';
Query OK, 2 rows affected (0.03 sec)

mysql> select * from test;
+-----+------------+
| uid | uname      |
+-----+------------+
|   1 | uname1     | 
|   2 | uname2     | 
|   3 | updateName | 
+-----+------------+
3 rows in set (0.00 sec)

mysql> create index i_test_uname on test(uname);
Query OK, 3 rows affected (0.20 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> INSERT INTO test VALUES ( 1 , 'uname2')    
-> ON DUPLICATE KEY UPDATE uname='update2records';
Query OK, 2 rows affected (0.00 sec)

mysql> select * from test;
+-----+----------------+
| uid | uname          |
+-----+----------------+
|   2 | uname2         | 
|   1 | update2records | 
|   3 | updateName     | 
+-----+----------------+
3 rows in set (0.00 sec)

插入时会与两条记录发生冲突,分别由主键和唯一索引引起。但最终只UPDATE了其中一条。这在手册中也说明了,有多个唯一索引(或者有键也有唯一索引)的情况下,不建议使用该语句。

create table xx (sad,xasd,asda,primary key(a,x,a));就可以用了,注意一定要有由主键和唯一索引^_^

分享到:
评论

相关推荐

    mss2sql_v5-3.zip SQL Server转换为MySQL工具

    SQL Server转换为MySQL工具,用了一下 感觉蛮不错的。 分享上来,同时也以便记录下来以后自用。 工具名称:Mss2sql 来个操作流程: 下载后打开压缩包 运行mss2sql 默认就是Move to MysQL server ...

    记使用Oracle SQL Developer 迁移MySql 数据至 Oracle.docx

    将mysql的数据库表迁移到oracle中,使用sql developer 工具进行迁移,在迁移过程中遇到了很多坑,比如视图或表不存在错误,本文都进行了一一讲解,亲测成功。

    DBHelper数据库操作类(支持OleDb、MySQL、Oracle、SQL、SQLite).zip

    数据库操作类(支持OleDb、MySQL、Oracle、SQL、SQLite、) 操作: 获取连接字符串 得到web.config里配置项的数据库连接字符串。 数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库. ...

    MySql转换成Oracle工具

    Convert Mysql to Oracle ...不能转换MYSQL的存储过程 Convert Mysql to Oracle 运行需求 有相应的数据库操作权限 在机器中安装了ORACLE客户端,使得Convert Mysql to Oracle能够成功连接到ORACLE

    MySQL数据库:表的创建SQL语句.pptx

    if not exists ,加一个判断,只有该表不存在时才执行 engine=存储引擎,mysql支持多存储引擎,不同的表可以有不同的存储引擎 表的创建 显示数据库表结构语法格式 {describe | desc} 表名 [列名 | 通配符]; 说明: | ...

    insert/update同时执行(mysql,oracle,sqlserver)

    判断是否存在,存在就update,不存在insert,不是用存储过程解决的。

    MYSQL常用命令大全

    9:导入.sql文件命令(例如D:/mysql.sql) mysql>use database; mysql>source d:/mysql.sql; 10:删除表 mysql>drop TABLE MYTABLE; 11:清空表 mysql>delete from MYTABLE; 12:更新表中数据 mysql>update MYTABLE set ...

    create.sql.gz

    zabbix 5.0 自带的create.sql.gz下载地址,mysql5.7,导入数据库命令 zcat create.sql.gz |mysql -uxxx -pxxx zabbix

    mysql 存在该记录则更新,不存在则插入记录的sql

    代码如下:INSERT table (auto_id, auto_name) values (1, ‘yourname’) ON ...例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果: 代码如下:mysql> INSERT INTO table (a,b,c) VALUES

    如何在MySQL中判断中文字符?

     mysql> SHOW VARIABLES LIKE "%version%";  +  ————————-+——————————+  | Variable_name | Value |  +  ————————-+——————————+  | protocol_version | 10 

    mysql启动提示mysql.host 不存在,启动失败的解决方法

    error 日志当中的记录: [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ ... 好了闲话不多说 说一下我解决的过程: 按照mysql的安装步骤: shell> groupadd mysql shell> user

    mysql数据库转瀚高数据库所需要的函数列表

    1、mysql数据库转国产化瀚高数据库; 2、有些函数在瀚高数据库中不存在,需要添加自定义函数。

    易语言mysql和SQLserver数据自动同步

    2.可以实现mssql 和mysql 导入时遇主键重复时更新某些字段, 3.可以对源字段和目的字段进行映射,可以避免自动编码类的字段. 4.可以设置调度,类似于 SQL Server 的导入导出 5.每个任务的所有设置都保存在一个dst的配置...

    【大厂面试题】MySQL执行计划及SQL优化

    【大厂面试题】MySQL执行计划及SQL优化 知识点标签:explain、sql优化、索引、sql性能问题 题目描述 MySQL执行计划及SQL优化 1.SQL语句表头运行一个explain时,执行后所显示的表头字段如下: id : select查询的...

    mysql数据库基础.pdf

    数据会频繁发⽣更新的场景下,MYSQL内置缓存将会频繁被清空,作⽤不⼤反⽽消耗操作资 源。 2. 命中率低,仅当SQL语句完全相同时才会命中查询内容。若存在⼀张静态表,很⻓时间才会 更新⼀次。⽐如,⼀个系统配置表,...

    python脚本,根据excel数据自动创建mysql库、表-并更新数据

    python3.7.4版本,文件包含excel文件和py文件。 py文件中需要手动设置excel字段在mysql中的类型、index索引及写入时校验的字段...执行py文件,若不存在数据库及表会自动创建,并写入数据(对于指定字段重复的不会写入)

    MySQL数据表添加字段

    MySQL 添加字段的语法格式如下: ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件]; 对语法格式的说明如下: <表名> 为数据表的名字; <新字段名> 为所要添加的字段的名字; <数据类型> 为所要添加的...

    oracle用什么SQL语句判断表存不存在

    正在看的ORACLE教程是:oracle用什么SQL语句判断表存不存在。... 您可能感兴趣的文章:Sql Server中判断表、列不存在则创建的方法Mysql判断表字段或索引是否存在sql server判断数据库、表、列、视图是否存在用SQL语句查

    SQL注入攻击与防御

    SQL注入攻击是一种已经长期存在,但近年来日益增长的安全威胁,克拉克所著的《SQL注入攻击与防御(第2版)》致力于深入探讨SQL注入问题。《SQL注入攻击与防御(第2版)》前一版荣获2009Bejtlich最佳图书奖,第2版对内容...

    mysql实现从导出数据的sql文件中只导入指定的一个表

    今天因发现某一个表tableA的一条数据存在问题,需核对两条记录的变化。需从dbAll中找回tableA的数据,以便比较该记录。 操作方案 1.将dbAll.sql.gz导入待比较的数据库(临时数据库)中,然后比较tableA。不推介,因为...

Global site tag (gtag.js) - Google Analytics