【问题标题】:select the rows affected by an update选择受更新影响的行
【发布时间】:2010-12-01 10:43:47
【问题描述】:

如果我有一个包含这些字段的表格:

int:id_account
int:session
string:password

现在对于登录语句,我运行这个 sql UPDATE 命令:

UPDATE tbl_name
SET session = session + 1
WHERE id_account = 17 AND password = 'apple'

然后我检查一行是否受到影响,如果确实受到影响,我知道密码是正确的。

接下来我要做的是检索此受影响行的所有信息,以便获得其余字段信息。
我可以使用一个简单的 SELECT 语句,但我确定我在这里遗漏了一些东西,一定有一种更简洁的方式,你们大师都知道,并且会告诉我 (:
此外,自从我编写的第一个登录 sql 语句以来,它一直困扰着我。

如果 UPDATE 确实更新了一行,是否有任何性能明智的方法可以将 SELECT 合并到 UPDATE 中?
还是我最好用两个语句简单地保留它?不需要原子性,所以我最好远离表锁,不是吗?

【问题讨论】:

  • 在 Oracle 中,您有 SQL%Rowcount 来检查 如何 许多 行受到最后一个 del/upd/ins 的影响。但要检索实际行,您必须SELECT。尝试用谷歌搜索 MySQL 中的类比
  • 我想为了简单起见,只需跟进一个查询——因为不需要原子性。
  • 别担心:“session = session + 1”本身就是原子的。我的感觉是你最好有两个陈述。
  • @Poni - 这似乎是一些设计问题,为什么需要将密码存储到会话表中?这个 session 表,你只需要 session 和 id_count。执行类似insert into tbl_name select id_account, 1 from YOUR_USER_TABLE where id_account=17 AND password='apple' ON DUPLICATE KEY UPDATE session=session+1;
  • @ajreal:您正在查看的表格是一个非常简化的示例,并不能真正代表我的表格,请不要忘记(:

标签: sql mysql


【解决方案1】:

您应该对 SELECT 使用相同的 WHERE 语句。它将返回修改后的行,因为您的 UPDATE 没有更改用于查找的任何列:

UPDATE tbl_name
SET session = session + 1
WHERE id_account = 17 AND password = 'apple';

SELECT *
FROM tbl_name
WHERE id_account = 17 AND password = 'apple';

建议:永远不要将密码存储为纯文本!使用哈希函数,如下所示:

MD5('apple')

【讨论】:

  • 谢谢 Silver 虽然我不确定这是我要做什么,因为让服务器比较密码两次是没有用的,这就是我确定的(:哦,谢谢求建议!
  • 对于 2008 年以后浏览这里的任何人,不要使用 MD5 作为密码的哈希函数。截至 2021 年,良好的哈希算法包括 PBKDF2、bcrypt 和 Argon2(均使用盐)。
【解决方案2】:

ROW_COUNT()(请阅读文档中的详细信息)。

用 SQL 跟进是好的和简单的(这总是好的),但它可能会给系统带来不必要的压力。

【讨论】:

  • 我认为您将我的问题与另一个问题或其他问题混淆了。我看不出这个答案与问题有什么关系,呵呵
  • @Poni,啊,我明白了,正在跟进 Alexander 关于甲骨文的评论。至于真正的问题 - 不,你不能在 SQL 中这样做,两个查询将是必要的。
【解决方案3】:

这不适用于诸如...之类的语句

Update Table
Set Value = 'Something Else'
Where Value is Null

Select Value From Table
Where Value is Null

您将在更新时更改了值,并且无法恢复受影响的记录,除非您事先存储它们。

Select * Into #TempTable 
From Table
Where Value is Null

Update Table
Set Value = 'Something Else'
Where Value is Null

Select Value, UniqueValue
From #TempTable TT
Join Table T
TT.UniqueValue = T.UniqueValue

如果幸运的话,您可以将临时表的记录连接到 Table 中的唯一字段以验证更新。这只是列举记录很重要的一个小例子。

【讨论】:

    【解决方案4】:

    您只需使用@@RowCount..即可获取受影响的行。

    select top (Select @@RowCount)  * from YourTable order by 1 desc
    

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 2019-11-20
      • 2011-06-11
      • 2021-05-06
      • 1970-01-01
      • 2014-12-08
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多