sql如果存在更新其他插入不工作

时间:2014-01-09 10:57:41

标签: mysql sql if-statement exists heidisql

我有一个包含3个通用键的表,这些键也是外键。这是我的查询 -

        IF (EXISTS(SELECT * FROM table1 WHERE col_1 =4))
        BEGIN 
        UPDATE table1 
    SET col_2 = 3,
    col_3 = 100
        WHERE col_1 = 4 
        END
        ELSE 
        BEGIN
        INSERT INTO table1 
    (col_1, col_2, col_3) 
        VALUES(4, 2, 27)
        END

这给我一个语法错误。引擎使用了InnoDB。整理:utf8_swedish_ci

我也试过了 -

              INSERT INTO table1
    (col1, col2, col3)
     VALUES
    (:val1, :val2, :val3)
    ON DUPLICATE KEY UPDATE
    col2=:val2,
    col3=:val3

这不能正常工作,只会插入行,尽管有重复的密钥。

5 个答案:

答案 0 :(得分:0)

试试这个:

IF EXISTS (SELECT 1 FROM table1 WHERE col_1 = '4') THEN 
BEGIN 
    UPDATE assignment_question 
    SET col_2 = '3', col_3 = '100' 
    WHERE col_1 = '4';
END
ELSE 
BEGIN
    INSERT INTO table1 (col_1, col_2, col_3) 
    VALUES (4, 2, 27);
END

答案 1 :(得分:0)

您可以尝试以下代码作为if exists的替代

SELECT COUNT(*) INTO COUNT FROM TABLE1 WHERE COL_1 = '4'
IF (COUNT > 0) THEN
BEGIN 
 UPDATE TABLE1 SET COL_2 = '3', COL_3 = '100' WHERE COL_1 = '4';
END
ELSE
BEGIN
 INSERT INTO TABLE1 (COL_1, COL_2, COL_3) VALUES (4, 2, 27);
END

希望这有帮助。

答案 2 :(得分:0)

通常对于您想要的场景:"更新/删除现有记录(如果存在)或如果记录不存在则插入新行" ,您可以使用Oracle提供的MERGE命令。

链接:https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm

PSB以下由Oracle提供的示例:

response.setContentType("application/json")
render JsonOutput.toJson(responseToRender);

答案 3 :(得分:0)

DELIMITER //
CREATE PROCEDURE p()                                                                                                                                                                     
BEGIN
    IF EXISTS(SELECT * FROM table1 WHERE col_1 = 4) THEN
        UPDATE table1 SET col_2 = 3, col_3 = 100 WHERE col_1 = 4;
    ELSE
        INSERT INTO table1 VALUES(4, 2, 27);
    END IF;
END//
DELIMITER ;

问题:

  1. 每个END IF语句必须IF;
  2. 我使用mysql创建了我的程序,因此根据documentation
  3.   

    如果使用 mysql 客户端程序来定义包含分号字符的存储程序,则会出现问题。默认情况下, mysql 本身将分号识别为语句分隔符,因此必须临时重新定义分隔符,以使mysql将整个存储的程序定义传递给服务器。

答案 4 :(得分:0)

试着把它放在BEGIN之前 也尝试在最后一行之后放置END IF

希望这项工作:

    IF (EXISTS(SELECT * FROM table1 WHERE col_1 =4)) **THEN**
    BEGIN 
    UPDATE table1 
SET col_2 = 3,
col_3 = 100
    WHERE col_1 = 4 
    END
    ELSE 
    BEGIN
    INSERT INTO table1 
(col_1, col_2, col_3) 
    VALUES(4, 2, 27)
    END
    **END IF**