如果已存在,则插入新行或DELETE旧行

时间:2014-02-06 00:50:00

标签: mysql sql insert sql-delete exists

我需要优化/实现MYSQL查询,并执行以下操作:

如果用户将项目标记为已显示,则需要存储,并创建SEEN / UNSEEN按钮,删除数据库中的对应行(如果已存在)(标记为已显示)或如果不存在则插入新行(没有标记)。

这意味着,我需要一个mysql查询来做到这一点:

    DELETE FROM table WHERE userid = ? AND itemid = ?

    INSERT INTO table (userid, itemid) VALUES (?,?)

取决于该行是否已存在。

我现在很容易使用php并在INSERT或DELETE之前检查SELECT的行数,但我想这样做所有优化的我可以。

4 个答案:

答案 0 :(得分:0)

您可以使用第三列存储整数,广告使用该值作为“切换”,以通过UPSERT查询在看到/未看到之间切换。

类似的东西:

INSERT INTO table (userid, itemid, seen) VALUES (?,?,0) ON DUPLICATE KEY UPDATE seen = ((seen+1) MOD 2);

主键应由useriditemid组成。 MOD运算符可以轻松高效地实现您想要的已见/看不见的行为。

答案 1 :(得分:0)

如果存在或INSERT,您可以使用stored procedure来SELECT和DELETE。但更简单的是将数据留在那里并使用ON DUPLICATE KEY UPDATE更新看/看不见。

答案 2 :(得分:0)

恕我直言,这是个错误的想法。 UI中的按钮不应被称为“看到/看不见”。 UI中的按钮必须具有具体名称,因此用户将知道他在做什么。 因此,无论如何,您需要在显示按钮之前进行SELECT。 按钮点击事件算法应该是这样的:

if not currently_is_seen then mark_as_seen else mark_as_not_seen;

按钮算法应该是这样的:

if current_button_name_is_mark_seen then {
    if not currently_is_seen then mark_as_seen;
} else {
    if currently_is_seen then mark_as_not_seen;
}

(如果在某些特定情况下按钮被命名为“标记看见”按钮,它已被标记为已显示 - 按钮将不执行任何操作。如果在某些特定条件下按钮被命名为“标记看不见”,则它已经标记为看不见 - 按钮只会什么都不做。但是当标记为“标记看见”或“标记未看到”的按钮执行相反的操作时,它不正常。)

实施

if not currently_is_seen then mark_as_seen;

if currently_is_seen then mark_as_not_seen;

你可以使用

INSERT IGNORE INTO table (userid, itemid) VALUES (?,?)

DELETE FROM table WHERE userid = ? AND itemid = ?

(如果记录不存在,删除不会导致错误。)

Hovewer,如果你想实现

if not currently_is_seen then mark_as_seen else mark_as_not_seen;

逻辑非常,您可以使用stored routinealso here)。

答案 3 :(得分:-1)

INSERT INTO表(a,b,c)VALUES(1,2,3),(4,5,6)   ON DUPLICATE KEY UPDATE c = VALUES(a)+ VALUES(b); 检查以下链接

http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm