Mysql SQL-如果存在更新ELSE插入语法错误
我有以下SQL查询: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
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的替代方案?