在MySql查询中需要帮助INSERT IF NOT EXISTS否则更新

时间:2016-06-13 15:33:56

标签: php mysql c#-4.0

我需要你的小帮助,我想更新现有记录,如果它已经存在于表中,否则插入新记录。我没有使用Where子句中的主键列。

每次在表中插入具有相同列1和列2值的新记录。

我也得到了一些回应,比如使用REPLACE。但REPLACE将适用于Unique / Primary Key的情况,否则会插入新记录。

我使用了以下查询

方法1:

IF EXISTS (select * from mytable3 WHERE field1 = 'A') THEN
BEGIN
    UPDATE mytable3  
    SET (field1 ='A', field2 = 'DD')  
    WHERE field1 = 'A'  
END
ELSE   
BEGIN
    INSERT INTO  mytable3 (field1, field2) VALUES ('A', 'DD')
END

方法2:

REPLACE mytable3 (field1, field2) VALUES ('A', 'DD');

表格结构:

CREATE TABLE mytable3 
(
     users int(11) NOT NULL AUTO_INCREMENT, 
     field1 varchar(10), 
     field2 varchar(10), 
     PRIMARY KEY(users)
); 

insert into mytable3 (field1, field2) values('A', 'AA');
insert into mytable3 (field1, field2) values('B', 'BB');
insert into mytable3 (field1, field2) values('C', 'CC');

注意:每次使用相同的字段1和字段2值在表中插入新记录

-------------------------原始问题------------------

我正在努力编写MySql查询以插入新记录(如果不存在),否则更新现有记录。但我面临语法错误如下:

  

错误代码:1064。您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   在'IF EXISTS附近使用的语法(SELECT * FROM wnduty。parcel-status-log   WHERE parcel-id = 1和'sh'在第1行

SQl查询如下:

IF EXISTS(SELECT * FROM wnduty.`parcel-status-log` WHERE `parcel-id` = 1 AND `shipping-status-id` = 4) 
   THEN 
        BEGIN
            UPDATE wnduty.`parcel-status-log`  SET (`status-date` ='2016-06-10 10:41:58', `is-synced`= 3) 
            WHERE `parcel-id` = 1 AND `shipping-status-id` = 4
        END        
    ELSE
        BEGIN
            INSERT INTO wnduty.`parcel-status-log`  (`parcel-id`,`shipping-status-id`, `is-synced`,`status-date`) 
            values(1, 4, 1, '2016-06-10 10:41:58') 
        END 
END IF   

我也尝试过以下查询,但仍然是语法错误..

INSERT INTO wnduty.`parcel-status-log` (`parcel-id`, `shipping-status-id`, `is-synced`, `status-date`) values(1, 4, 1, '2016-06-10 10:41:57')
ON DUPLICATE KEY UPDATE 
`status-date` ='2016-06-13 11:41:58',`is-synced` = 3, `shipping-status-id` = 4 ;

我正在使用MySql版本,如下所示:

  • innodb_version 5.7.12
  • protocol_version 10
  • version_compile_os Win64

2 个答案:

答案 0 :(得分:0)

您可以使用与INSERT INTO相同的语法来使用UPDATE INTO,如果记录是表中任何唯一键的重复,那么它将更新记录,否则将使用相同的SQL语句插入。

答案 1 :(得分:0)

只需使用REPLACE而不是INSERT,它就能完全满足您的要求......

INSERT INTO wnduty.parcel-status-log ...

parcel-status-log

来自mysql man:

  

REPLACE的工作方式与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。请参见第14.2.5节“INSERT语法”。

完整替换示例:

REPLACE wnduty.parcel-status-log ... 

现在用一个新值替换一行,无论它是否存在:

parcel-status-log