Mysql 插入新行或删除旧行(如果已存在)
我需要优化/实现一个MYSQL查询,并执行以下操作: 我需要存储用户是否将项目标记为“已看到”,并创建“已看到/未看到”按钮,如果数据库中已存在对应行(标记为“已看到”),则删除该行;如果不存在对应行(未标记),则插入新行 这意味着,我需要一个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 (?,?) 取决于行是否已存
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向他显示),但我只是指后端。关于创建一个函数,根据用户以前的操作(是否标记该项),在一个查询中实现我想要的功能。但是,是的,我看到存储的例程可能是答案。谢谢是的,我想这就是办法。我会试试看我是否能理解那种方法