MySQL 包含插入和更新的案例

MySQL Case with Insert and Update

我需要帮助编写条件查询以将数据从一个 table 复制到另一个,一切都非常简单,直到我决定要在我的应用程序中包含版本控制!

我看过一些示例,但它们主要面向创建 mysql 过程,这是我尝试过的:

        SELECT CASE 
            WHEN NOT EXISTS (
                SELECT `version`
                FROM `archive_courses`
                WHERE `original_course_id` = '$course_id'
                AND `version` = '$current_version'
            )
            THEN
                BEGIN
                    INSERT INTO `archive_course_users`      <------ syntax error
                    (`course_id`, `user_id`, `course_qty`)
                    SELECT @new_course_id, '$user_id', `course_qty`
                    FROM `current_course_users`
                    WHERE `course_id` = '$course_id'
                    AND `user_id` = '$user_id'
                END
            ELSE
                BEGIN
                    UPDATE `archive_course_users`
                    SET `course_qty` = (SELECT `course_qty` FROM `current_course_users` WHERE `user_id` = '$user_id')
                    WHERE `original_course_id` = '$course_id'
                    AND `user_id` = '$user_id'
                END
            END
        END

看起来这个案例工作正常/OK/ 但是当它到达我的 INSERT 查询时抛出语法错误。 我应该怎么做?

它不应该那样工作。将您的查询更改为

               INSERT INTO `archive_course_users`     
                (`course_id`, `user_id`, `course_qty`)
                SELECT @new_course_id, '$user_id', `course_qty`
                FROM `current_course_users`
                WHERE `course_id` = '$course_id'
                AND `user_id` = '$user_id'
                AND NOT EXISTS (
            SELECT 1
            FROM `archive_courses`
            WHERE `original_course_id` = '$course_id'
            AND `version` = '$current_version');

你试过了吗"insert.. on duplicate key update"

这是 mysql 手册中的示例:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

希望对您有所帮助

根据@Rahul 的回答,我创建了两个查询:

    //INSERT IF NOT EXISTS
        INSERT INTO `archive_course_users`
        (`course_id`, `user_id`, `course_qty`)
        SELECT @new_course_id, '$user_id', `course_qty`
        FROM `current_course_users`
        WHERE NOT EXISTS (
            SELECT `version`
            FROM `archive_courses`
            WHERE `original_course_id` = '$course_id'
            AND `version` = '$current_version'
        )
        AND `course_id` = '$course_id'
        AND `user_id` = '$user_id'

    //UPDATE IF EXISTS
        UPDATE `archive_course_users`
        SET `course_qty` = (SELECT `course_qty` FROM `current_course_users` WHERE `user_id` = '$user_id')
        WHERE EXISTS (
            SELECT `version`
            FROM `archive_courses`
            WHERE `original_course_id` = '$course_id'
            AND `version` = '$current_version'
        )
        AND `original_course_id` = '$course_id'
        AND `user_id` = '$user_id'

SELECT 中不能有语句。所以要么

将代码移出SELECT:

 IF (...) THEN   -- Note:  No "CASE"; not "WHEN"
     INSERT ...
 ELSE
     UPDATE
 END IF

SELECT某种标志,然后在外面使用IF语句。