Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-如果存在更新ELSE插入语法错误_Mysql_Sql - Fatal编程技术网

Mysql SQL-如果存在更新ELSE插入语法错误

Mysql SQL-如果存在更新ELSE插入语法错误,mysql,sql,Mysql,Sql,我有以下SQL查询: IF EXISTS(SELECT * FROM component_psar WHERE tbl_id = '2' AND row_nr = '1') UPDATE component_psar SET col_1 = '1', col_2 = '1', col_3 = '1', col_4 = '1', col_5 = '1', col_6 = '1', unit = '1', add_info = '1', fsar

我有以下SQL查询:

IF EXISTS(SELECT * FROM component_psar WHERE tbl_id = '2' AND row_nr = '1') 
   UPDATE component_psar
      SET col_1 = '1', col_2 = '1', col_3 = '1', col_4 = '1', col_5 = '1',
                 col_6 = '1', unit = '1', add_info = '1', fsar_lock = '1' 
    WHERE tbl_id = '2' AND row_nr = '1' 
ELSE 
    INSERT INTO component_psar (tbl_id, row_nr, col_1, col_2, col_3, col_4,
                                col_5, col_6, unit, add_info, fsar_lock)
    VALUES ('2', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'N')
忽略我试图将每一列设置为“1”的事实。这只是示例数据。:)

无论如何,执行此查询将返回语法错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your
     MySQL server version for the right syntax to use near 'IF EXISTS(SELECT * FROM
     component_psar WHERE tbl_id = '2' AND row_nr = '1') UP' at line 1

我盯着它,在互联网上搜索了整整半个小时,就是找不到这个假定的语法错误。我可能会错过一些非常愚蠢的东西,但在这一点上我需要你们的帮助。

这里是文档声明的链接

INSERT INTO component_psar (tbl_id, row_nr, col_1, col_2, col_3, col_4, col_5, col_6, unit, add_info, fsar_lock)
VALUES('2', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'N')
ON DUPLICATE KEY UPDATE col_1 = VALUES(col_1), col_2 = VALUES(col_2), col_3 = VALUES(col_3), col_4 = VALUES(col_4), col_5 = VALUES(col_5), col_6 = VALUES(col_6), unit = VALUES(unit), add_info = VALUES(add_info), fsar_lock = VALUES(fsar_lock)
将使用
tbl\u id
row\u nr
具有
UNIQUE


这是DocJonas通过示例链接到的方法。

您必须添加
,然后添加

IF EXISTS(SELECT * FROM component_psar WHERE tbl_id = '2' AND row_nr = '1') 
THEN
UPDATE component_psar SET col_1 = '1', col_2 = '1', col_3 = '1', col_4 = '1', col_5 = '1', col_6 = '1', unit = '1', add_info = '1', fsar_lock = '1' WHERE tbl_id = '2' AND row_nr = '1' 
ELSE 
INSERT INTO component_psar (tbl_id, row_nr, col_1, col_2, col_3, col_4, col_5, col_6, unit, add_info, fsar_lock) VALUES('2', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'N')

在这种方法中,当更新成功时,只执行一条语句

-- For each row in source
BEGIN TRAN    

UPDATE target
SET <target_columns> = <source_values>
WHERE <target_expression>

IF (@@ROWCOUNT = 0)
   INSERT target (<target_columns>)
VALUES (<source_values>)

COMMIT
——对于源代码中的每一行
开始训练
更新目标
集合=
哪里
如果(@@ROWCOUNT=0)
插入目标()
值()
犯罪

使用以下语句:

IF EXISTS(SELECT * FROM prueba )
then
  UPDATE prueba
  SET nombre = '1', apellido = '1' 
  WHERE cedula = 'ct'
ELSE 
  INSERT INTO prueba (cedula, nombre, apellido)
  VALUES ('ct', 'ct', 'ct');

这不是最优雅的吗

REPLACE 
INTO component_psar (tbl_id, row_nr, col_1, col_2, col_3, col_4, col_5, col_6, unit, add_info, fsar_lock) 
VALUES('2', '1', '1', '1', '1', '1', '1', '1', '1', '1', 'N')

请参阅:

是否在存储过程中执行此操作?不,我不是在存储过程中执行此操作。应该吗?如果ESISTS语法只在MSSQL中工作,而在MySQL中不工作,可能会重复。这非常有效,谢谢。我必须使tbl_id和row_nr成为它工作的唯一键,但事后看来,它们无论如何都应该是唯一的,所以这只是另一件正确的事情。:)很好地指出,
UNIQUE
列的作用方式与
PRIMARY
相同。我不确定它是否会导致问题。您如何知道这是一个插入或后续操作的更新
在重复键更新时,如果将行作为新行插入,则每行受影响的行值为1,如果更新现有行,则每行受影响的行值为2我在插入和更新一个大表(150-200k行)时遇到了麻烦,在重复数据上进行插入和更新要快得多。(5秒/1000行vs 60秒/1000行)我很欣赏这种情绪(首先是你的答案),但给我举一个如何像罗宾·卡斯特林那样放火的例子比告诉我在谷歌上搜索“如何生火”更有用。:)虽然这是真的,但我个人通过例子学习得最好。希望这足以让他将来知道如何使用这个函数。我将使用这个函数,而不是公认的答案,因为在我的应用程序中,我预计更新将在绝大多数情况下成功。实际上,为什么不使用merge语句呢?“合并”允许将源表合并到目标表中,并在需要时一次完成更新、插入和删除操作。我可以在此过程中使用多个值吗?与:
INSERT INTO table VALUES(1、2、3)、(4、5、6)
等类似。这取决于是否要保留主键/自动递增字段。如果插入前原始行当前存在,“替换”将删除该行。另外请注意,如果您有大量带索引的记录,那么删除可能需要很长时间,在这种情况下,如果记录已经存在,则删除是不必要的。是否有mysql的替代方案?