zoukankan      html  css  js  c++  java
  • 【转】MySQL数据表中记录不存在则插入,存在则更新

    mysql 记录不存在时插入
    在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案。 

    问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢? 

    答案:可以通过使用 EXISTS 条件句防止插入重复记录。 

    示例一:插入多条记录 

    假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: 

    复制代码代码如下:

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


    示例一:插入单条记录 

    复制代码代码如下:

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


    使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。

    mysql 记录不存在时插入 记录存在则更新的实现方法

    复制代码代码如下:

    mysql> truncate `200702`; 
    Query OK, 0 rows affected (0.01 sec) 
    mysql> select * from `200702`; 
    Empty set (0.01 sec)<span id="more-22"></span> 
    mysql> insert into `200702` (`domain`, `2nd_domain`, `tld`, `query_ns1`, `query_ns2`, `report_date`) values ('dnspod.com', 'dnspod', 'com', 1000, 2000, '2007-02-04') ON DUPLICATE KEY UPDATE `query_ns1` = `query_ns1` + 1000, `query_ns2` = `query_ns2` + 2000; 
    Query OK, 1 row affected (0.00 sec) 

    mysql> select * from `200702`; 
    +----+------------+------------+------+-----------+-----------+-----------+-----------+-------------+ 
    | id | domain | 2nd_domain | tld | query_ns1 | query_ns2 | query_ns3 | query_ns4 | report_date | 
    +----+------------+------------+------+-----------+-----------+-----------+-----------+-------------+ 
    | 1 | dnspod.com | dnspod | com | 1000 | 2000 | 0 | 0 | 2007-02-04 | 
    +----+------------+------------+------+-----------+-----------+-----------+-----------+-------------+ 
    1 row in set (0.00 sec) 

    mysql> insert into `200702` (`domain`, `2nd_domain`, `tld`, `query_ns1`, `query_ns2`, `report_date`) values ('dnspod.com', 'dnspod', 'com', 1000, 2000, '2007-02-04') ON DUPLICATE KEY UPDATE `query_ns1` = `query_ns1` + 1000, `query_ns2` = `query_ns2` + 2000; 
    Query OK, 2 rows affected (0.01 sec) 

    mysql> select * from `200702`; 
    +----+------------+------------+------+-----------+-----------+-----------+-----------+-------------+ 
    | id | domain | 2nd_domain | tld | query_ns1 | query_ns2 | query_ns3 | query_ns4 | report_date | 
    +----+------------+------------+------+-----------+-----------+-----------+-----------+-------------+ 
    | 1 | dnspod.com | dnspod | com | 2000 | 4000 | 0 | 0 | 2007-02-04 | 
    +----+------------+------------+------+-----------+-----------+-----------+-----------+-------------+ 
    1 row in set (0.01 sec) 
    mysql> 

    当然,建表的时候,千万别忘记了给domain做一个unique 
    UNIQUE KEY `domain` (`domain`,`report_date`) 

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第4章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第3章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第1,2章 读书笔记(待更新)
    Tkinter的Message组件
    Git 实操/配置/实践
    mysq5.7.32-win安装步骤
    行为型模式之模板方法
    结构型模式之组合模式
    结构型模式之享元模式
    结构型模式之外观模式
  • 原文地址:https://www.cnblogs.com/hanyouchun/p/4718798.html
Copyright © 2011-2022 走看看