首页 文章

如果不存在MySql表插入,否则更新

提问于
浏览
84
UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

如果 datenum 存在,它可以工作,但如果 datenum 不存在,我想将此数据作为新行插入 .

UPDATE

datenum是唯一的,但这不是主键

3 回答

  • 118

    Jai是正确的,你应该使用 INSERT ... ON DUPLICATE KEY UPDATE .

    请注意,您不需要在update子句中包含datenum,因为它是唯一键,因此不应更改 . 您需要包含表中的所有其他列 . 您可以使用VALUES()函数确保在更新其他列时使用正确的值 .

    以下是使用适用于MySQL的 INSERT ... ON DUPLICATE KEY UPDATE 语法重写的更新:

    INSERT INTO AggregatedData (datenum,Timestamp)
    VALUES ("734152.979166667","2010-01-14 23:30:00.000")
    ON DUPLICATE KEY UPDATE 
      Timestamp=VALUES(Timestamp)
    
  • 0

    尝试使用this

    如果指定ON DUPLICATE KEY UPDATE,并且插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则MySQL将执行[UPDATE`](http://dev.mysql.com/doc/refman/5.7旧行的/en/update.html)ON DUPLICATE KEY UPDATE子句可以包含多个列分配,以逗号分隔 . 使用ON DUPLICATE KEY UPDATE时,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则每行受影响的行值为2;如果现有行设置为其当前值,则每行受影响的行值为0 . 如果在连接到mysqld时将CLIENT_FOUND_ROWS标志指定给mysql_real_connect(),则如果将现有行设置为其当前值,则受影响的行值为1(不为0)...

  • 14

    我有一种情况,我需要根据两个字段(两个外键)更新或插入表,我无法设置UNIQUE约束(因此INSERT ... ON DUPLICATE KEY UPDATE将不起作用) . 这是我最终使用的内容:

    replace into last_recogs (id, hasher_id, hash_id, last_recog) 
      select l.* from 
        (select id, hasher_id, hash_id, [new_value] from last_recogs 
         where hasher_id in (select id from hashers where name=[hasher_name])
         and hash_id in (select id from hashes where name=[hash_name]) 
         union 
         select 0, m.id, h.id, [new_value] 
         from hashers m cross join hashes h 
         where m.name=[hasher_name] 
         and h.name=[hash_name]) l 
      limit 1;
    

    此示例来自我的一个数据库,输入参数(两个名称和一个数字)替换为[hasher_name],[hash_name]和[new_value] . 嵌套的SELECT ... LIMIT 1拉出现有记录中的第一个或新记录(last_recogs.id是自动增量主键),并将其用作REPLACE INTO的值输入 .

相关问题