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));就可以用了,注意一定要有由主键和唯一索引^_^
相关推荐
SQL Server转换为MySQL工具,用了一下 感觉蛮不错的。 分享上来,同时也以便记录下来以后自用。 工具名称:Mss2sql 来个操作流程: 下载后打开压缩包 运行mss2sql 默认就是Move to MysQL server ...
将mysql的数据库表迁移到oracle中,使用sql developer 工具进行迁移,在迁移过程中遇到了很多坑,比如视图或表不存在错误,本文都进行了一一讲解,亲测成功。
数据库操作类(支持OleDb、MySQL、Oracle、SQL、SQLite、) 操作: 获取连接字符串 得到web.config里配置项的数据库连接字符串。 数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库. ...
Convert Mysql to Oracle ...不能转换MYSQL的存储过程 Convert Mysql to Oracle 运行需求 有相应的数据库操作权限 在机器中安装了ORACLE客户端,使得Convert Mysql to Oracle能够成功连接到ORACLE
if not exists ,加一个判断,只有该表不存在时才执行 engine=存储引擎,mysql支持多存储引擎,不同的表可以有不同的存储引擎 表的创建 显示数据库表结构语法格式 {describe | desc} 表名 [列名 | 通配符]; 说明: | ...
判断是否存在,存在就update,不存在insert,不是用存储过程解决的。
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 ...
zabbix 5.0 自带的create.sql.gz下载地址,mysql5.7,导入数据库命令 zcat create.sql.gz |mysql -uxxx -pxxx zabbix
代码如下:INSERT table (auto_id, auto_name) values (1, ‘yourname’) ON ...例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果: 代码如下:mysql> INSERT INTO table (a,b,c) VALUES
mysql> SHOW VARIABLES LIKE "%version%"; + ————————-+——————————+ | Variable_name | Value | + ————————-+——————————+ | protocol_version | 10
error 日志当中的记录: [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ ... 好了闲话不多说 说一下我解决的过程: 按照mysql的安装步骤: shell> groupadd mysql shell> user
1、mysql数据库转国产化瀚高数据库; 2、有些函数在瀚高数据库中不存在,需要添加自定义函数。
2.可以实现mssql 和mysql 导入时遇主键重复时更新某些字段, 3.可以对源字段和目的字段进行映射,可以避免自动编码类的字段. 4.可以设置调度,类似于 SQL Server 的导入导出 5.每个任务的所有设置都保存在一个dst的配置...
【大厂面试题】MySQL执行计划及SQL优化 知识点标签:explain、sql优化、索引、sql性能问题 题目描述 MySQL执行计划及SQL优化 1.SQL语句表头运行一个explain时,执行后所显示的表头字段如下: id : select查询的...
数据会频繁发⽣更新的场景下,MYSQL内置缓存将会频繁被清空,作⽤不⼤反⽽消耗操作资 源。 2. 命中率低,仅当SQL语句完全相同时才会命中查询内容。若存在⼀张静态表,很⻓时间才会 更新⼀次。⽐如,⼀个系统配置表,...
python3.7.4版本,文件包含excel文件和py文件。 py文件中需要手动设置excel字段在mysql中的类型、index索引及写入时校验的字段...执行py文件,若不存在数据库及表会自动创建,并写入数据(对于指定字段重复的不会写入)
MySQL 添加字段的语法格式如下: ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件]; 对语法格式的说明如下: <表名> 为数据表的名字; <新字段名> 为所要添加的字段的名字; <数据类型> 为所要添加的...
正在看的ORACLE教程是:oracle用什么SQL语句判断表存不存在。... 您可能感兴趣的文章:Sql Server中判断表、列不存在则创建的方法Mysql判断表字段或索引是否存在sql server判断数据库、表、列、视图是否存在用SQL语句查
SQL注入攻击是一种已经长期存在,但近年来日益增长的安全威胁,克拉克所著的《SQL注入攻击与防御(第2版)》致力于深入探讨SQL注入问题。《SQL注入攻击与防御(第2版)》前一版荣获2009Bejtlich最佳图书奖,第2版对内容...
今天因发现某一个表tableA的一条数据存在问题,需核对两条记录的变化。需从dbAll中找回tableA的数据,以便比较该记录。 操作方案 1.将dbAll.sql.gz导入待比较的数据库(临时数据库)中,然后比较tableA。不推介,因为...