【问题标题】:Need help in MySql query INSERT IF NOT EXISTS Otherwise UPDATE在 MySql 查询中需要帮助 INSERT IF NOT EXISTS 否则 UPDATE
【发布时间】:2016-10-14 02:39:43
【问题描述】:

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

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

我得到的回应很少,比如使用 REPLACE。但 REPLACE 将适用于唯一 / 主键的情况,否则插入新记录。

我使用了以下查询

方法一:

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

方法二:

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 AND `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

【问题讨论】:

标签: php mysql c#-4.0


【解决方案1】:

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

【讨论】:

  • 在 IF EXISTS 附近仍然出现错误,如下错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获得在 'IF EXISTS(SELECT * 附近使用的正确语法
  • 实际上系统错误在启动时出现在 IF 位置。当我翻转错误时,如下所示'IF'(如果)在此位置无效输入
【解决方案2】:

只需使用 REPLACE 而不是 INSERT,它就可以满足您的需求......

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

REPLACE wnduty.parcel-status-log ...

来自 mysql 人:

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

完整替换示例:

mysql> CREATE TABLE mytable ( users TINYINT(1), field varchar(10), PRIMARY KEY(users));
mysql> insert into mytable values(1, 'A');
mysql> insert into mytable values(2, 'B');
mysql> insert into mytable values(3, 'C');

现在用新值替换一行,不管它是否存在:

mysql> REPLACE mytable (users, field) VALUES (2, "New Value");
mysql> REPLACE mytable (users, field) VALUES (4, "D");

【讨论】:

  • 我已经尝试通过替换但仍然存在相同的错误 IF EXISTS(SELECT * FROM wnduty.parcel-status-log WHERE parcel-id = 1 AND shipping-status-id = 4) 然后开始更新 wnduty.parcel-status-log SET (status-date ='2016-06-10 10:41:58', is-synced= 3) 其中parcel-id = 1 和shipping-status-id = 4 END ELSE BEGIN REPLACE 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
  • 实际上系统错误在启动时出现在 IF 位置。当我翻转错误时,如下所示'IF'(如果)在此位置无效输入
  • 请通过以下示例 CREATE TABLE mytable ( users varchar(10), field varchar(10) ) 提供帮助; -- 插入 mytable 值('abc', 'hdgsh');插入 mytable 值('abdc','hdsagsh');插入 mytable 值('abcd','hdgshfg');插入 mytable 值('something','hdgshfg'); select * from mytable -- 我需要下面的查询 IF EXISTS (select * from mytable where users = 'something') 然后从 mytable where users = 'something' END IF 中选择字段;否则替换 mytable (users) 值 ('something2');
  • 尊敬的先生,当使用主键字段更新或所有文件都与现有记录匹配时,它工作正常。如果更新标准没有主键字段(例如 where 子句中只有一个字段,我们必须更新所有匹配的字段),那么它总是插入新记录。我需要更新没有 Key 字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多