`
hougechuanqi
  • 浏览: 73157 次
  • 性别: 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));就可以用了,注意一定要有由主键和唯一索引^_^

分享到:
评论

相关推荐

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...

    presto sql 与mysql sql 对比.pdf

    例如,在 MySQL SQL 中,`where` 条件中的字符串类型可以隐式转换为数字类型,但这可能会造成索引不起效和非预期的结果。 聚合函数 Presto SQL 和 MySQL SQL 都支持聚合函数,如 `count()`、`sum()`、`avg()` 等。...

    Oracle数据库sql转换mysql数据库工具

    Oracle数据库和MySQL数据库是两种广泛使用的数据库管理系统,它们在数据存储、查询语法、数据库结构以及管理方式上存在显著差异。"Oracle数据库sql转换mysql数据库工具" 提供了解决这一问题的解决方案,允许用户将...

    不进入mysql 就能导入sql脚本的方法

    标题提到的“不进入mysql就能导入sql脚本的方法”是一种提高效率和便利性的技巧,尤其适用于大型数据库或者频繁进行数据迁移的情况。下面我们将详细介绍这个方法以及相关的知识点。 首先,SQL脚本通常包含了创建表...

    数据库转换工具MySQL 转为SqlServer 脚本

    - **评估和修复**:转换后,工具会提供一份报告,指出可能存在的不兼容问题。开发者需要根据报告修复问题,例如调整数据类型、函数或语句的兼容性。 - **生成和执行脚本**:最后,工具会生成SQL Server兼容的创建...

    SQLDeveloper工具/MySQL/SQLServer驱动程序

    关于MySQL驱动程序,当SQLDeveloper与MySQL集成时,它允许开发者连接到MySQL服务器,进行数据查询、更新、创建新表结构或执行其他DDL(Data Definition Language)和DML(Data Manipulation Language)操作。...

    从mysql数据库迁移至sqlserver数据库

    首先,MySQL和SQL Server是两种不同的关系型数据库管理系统(RDBMS),它们之间存在一些语法和数据类型的差异。MySQL常用的数据类型如`TEXT`在SQL Server中对应的是`VARCHAR(MAX)`或`NVARCHAR(MAX)`。在迁移过程中,...

    SQL Server转换为MySQL工具

    这一步骤需要注意数据类型不兼容的问题,例如,SQL Server的datetime与MySQL的datetime可能存在差异,需要进行适配。 3. 触发器和存储过程:SQL Server的触发器和存储过程是数据库逻辑的重要组成部分。在转换时,...

    mysql数据库转换成SQLserver数据库

    同时,要注意不同数据库的数据类型可能存在差异,如MySQL的VARCHAR与SQL Server的NVARCHAR。 2. **结构映射**:由于MySQL和SQL Server的语法和特性有所不同,转换过程中需要对表结构进行映射。例如,MySQL的ENUM...

    Navicat 实现同步sqlserver表结构到mysql操作手册1

    SQL Server和MySQL对某些数据类型的支持可能存在差异,因此在迁移过程中可能需要进行相应的调整。同时,为了保证数据的一致性,建议在迁移前备份源数据库。 总的来说,Navicat提供的同步功能简化了SQL Server到...

    Sqlserver2mysql

    注意,MySQL可能不支持SQL Server所有特定的数据类型,所以可能需要调整数据类型。 5. **数据导入**:使用`mss2sql`生成的SQL脚本或工具来导入数据到MySQL。这个过程可能需要对大量数据进行分批处理,以减少内存...

    MySQL数据库优化SQL篇PPT课件.pptx

    MySQL数据库优化SQL篇PPT课件.pptx 本PPT课件主要讲述了MySQL数据库优化的重要知识点,特别是SQL优化方面的内容。从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和...

    mysql转换为sqlserver

    3. 数据格式转换:由于SQL Server与MySQL的数据类型存在差异,导出的SQL脚本可能需要手动或通过自动化工具进行修改,确保数据类型的兼容性。例如,将MySQL的`DATE`转换为SQL Server的`DATE`,`VARCHAR`转换为`...

    oracle,sqlserver及mysql对比

    如果不存在某个子句,就跳过。 日期函数方面,Oracle 使用 TO_CHAR 语句,而 MySQL 使用 DATE_FORMAT 函数。增加一个月,可以使用 ADD_MONTHS 函数在 Oracle 中,而 MySQL 使用 DATE_ADD 函数。截取字符串方面,...

    Mysql运行SQL语句中文乱码问题的解决方法

    当MySQL处理中文字符时,如果当前使用的字符集与数据的实际字符集不一致,就会出现乱码。 #### 二、检查系统及数据库的字符集设置 首先需要确认服务器和数据库的字符集设置是否正确。可以通过以下SQL命令来查看: ...

    SQL Server数据库数据转MySQL工具

    1. **数据结构映射**:SQL Server和MySQL的数据库结构可能存在差异,如数据类型、索引、约束等。转换工具需要能够识别这些差异并进行相应的调整,确保数据在目标数据库中的正确表示。 2. **数据迁移**:工具会逐表...

    sql 数据库导入 mysql数据库的工具 sql 转化mysql

    当你需要将数据从一个数据库系统迁移到另一个,比如从SQL Server(SQL数据库)到MySQL,就需要利用特定的工具和方法来完成这个过程。本文将深入探讨如何使用工具进行SQL到MySQL的数据迁移。 标题中的"sql 数据库...

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

    创建一个与MySQL数据库名相同的Oracle用户,这是非常关键的,因为不一致会导致“视图或表不存在”的错误。同时,为该用户创建表空间以优化存储管理,避免内存溢出。表空间是Oracle数据库中存储数据的逻辑单元,可以...

    MySQL开发者SQL权威指南

    MySQL开发者SQL权威指南是一本专为MySQL开发人员设计的详细教程,旨在帮助读者深入理解和熟练掌握SQL语言在MySQL环境中的应用。SQL(Structured Query Language),结构化查询语言,是管理和处理关系数据库的标准...

    mysql数据库转换成sql server

    MySQL数据库和SQL Server是两种广泛使用的数据库管理系统,它们在语法、功能和管理上存在显著差异。将MySQL数据库转换成SQL Server是一项常见的需求,特别是在企业级应用迁移或整合项目中。以下是一些关于如何进行...

Global site tag (gtag.js) - Google Analytics