Mysql 插入新行或删除旧行(如果已存在)

Mysql 插入新行或删除旧行(如果已存在),mysql,sql,insert,sql-delete,exists,Mysql,Sql,Insert,Sql Delete,Exists,我需要优化/实现一个MYSQL查询,并执行以下操作: 我需要存储用户是否将项目标记为“已看到”,并创建“已看到/未看到”按钮,如果数据库中已存在对应行(标记为“已看到”),则删除该行;如果不存在对应行(未标记),则插入新行 这意味着,我需要一个mysql查询: DELETE FROM table WHERE userid = ? AND itemid = ? 或者 INSERT INTO table (userid, itemid) VALUES (?,?) 取决于行是否已存

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

我需要存储用户是否将项目标记为“已看到”,并创建“已看到/未看到”按钮,如果数据库中已存在对应行(标记为“已看到”),则删除该行;如果不存在对应行(未标记),则插入新行

这意味着,我需要一个mysql查询:

    DELETE FROM table WHERE userid = ? AND itemid = ?
或者

    INSERT INTO table (userid, itemid) VALUES (?,?)
取决于行是否已存在


我现在可以很容易地使用php在插入或删除之前检查SELECT的行数,但我希望尽我所能进行优化。

您可以使用第三列存储整数,并使用该值作为“切换”,通过UPSERT查询在可见/不可见之间切换

比如:

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

主键应由
userid
itemid
组成。
MOD
运算符将使实现所需的可见/不可见行为变得简单高效。

您可以使用第三列存储整数,并使用该值作为“切换”,通过UPSERT查询在可见/不可见之间切换

比如:

INSERT INTO table (userid, itemid, seen) VALUES (?,?,0) ON DUPLICATE KEY UPDATE seen = ((seen+1) MOD 2);
主键应由
userid
itemid
组成。
MOD
操作符将使实现所需的可见/不可见行为变得简单高效。

您可以使用它来选择和删除(如果存在)或插入。但更简单的方法是将数据保留在那里,并使用“可见/不可见”更新。

您可以使用选择和删除(如果存在)或插入。但更简单的方法是将数据保留在那里,并使用表(a、b、c)中的值(1、2、3)、(4、5、6)更新可见/不可见的数据 在重复密钥更新时,c=值(a)+值(b); 检查以下链接

在表(a、b、c)中插入值(1,2,3)、(4,5,6) 在重复密钥更新时,c=值(a)+值(b); 检查以下链接

嗯,那是个错误的想法。 UI中的按钮不应称为“使可见/不可见”。UI中的按钮必须有具体的名称,这样用户才能知道他在做什么。 因此,无论如何,在显示按钮之前,您都需要进行选择。 按钮点击事件算法不应该是这样的:

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 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;

你可以用

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

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

Howewer,如果你想实现

if not currently_is_seen then mark_as_seen else mark_as_not_seen;
非常符合逻辑,您可以使用()。

嗯,这是一个错误的想法。 UI中的按钮不应称为“使可见/不可见”。UI中的按钮必须有具体的名称,这样用户才能知道他在做什么。 因此,无论如何,在显示按钮之前,您都需要进行选择。 按钮点击事件算法不应该是这样的:

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 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;

你可以用

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

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

Howewer,如果你想实现

if not currently_is_seen then mark_as_seen else mark_as_not_seen;

逻辑非常好,你可以使用()。

他需要重复键删除,而不是重复键更新。他需要重复键删除,而不是重复键更新。你不能使用REPLACE-INTO-TABLE(userid,itemid)值(?,)@Spartacus38,不是他不能。他想删除当前存在的记录,或者插入当前不存在的记录。您不能使用REPLACE-INTO-TABLE(userid,itemid)值(?,)@Spartacus38,他不能。他想删除当前存在的记录,或者插入当前不存在的记录。我也这么想,但我不知道这是否会非常优化,因为如果用户在将某个项目标记为“已看到”后将其标记为“未看到”,则该行将保留在数据库中,这将完全无用。我认为任何程序员都必须制作每一个程序,每一个应用程序,支持这将有一百万用户,准备好每一行,使程序尽可能的高效和优化。所以我认为必须有另一种方法来做到这一点。无论如何,谢谢你的回答!我也这么想,但我不知道它是否会被优化,因为如果用户在将某个项目标记为“已看到”后将其标记为“未看到”,则该行将保留在数据库中,并且完全没有用处。我认为任何程序员都必须制作每一个程序,每一个应用程序,支持这将有一百万用户,准备好每一行,使程序尽可能的高效和优化。所以我认为必须有另一种方法来做到这一点。无论如何,谢谢你的回答!显然,用户总是知道自己在做什么(我用一个SELECT as you comment向他显示),但我只是指后端。关于创建一个函数,根据用户以前的操作(是否标记该项),在一个查询中实现我想要的功能。但是,是的,我看到存储的例程可能是答案。谢谢显然,用户总是知道自己在做什么(我用一个SELECT as you comment向他显示),但我只是指后端。关于创建一个函数,根据用户以前的操作(是否标记该项),在一个查询中实现我想要的功能。但是,是的,我看到存储的例程可能是答案。谢谢是的,我想这就是办法。我会试试看我是否能理解那种方法