我们都知道,在编程语言中,返回值是最基本的东西。但是对于数据库,我们只是不期望任何返回值。这是一个错误的概念,因为它将我们的数据库简化为一个黑匣子。有时知道哪些行受更新影响可能会很好。
那么我们如何构建在插入或更新后返回值的数据库呢?(不是在选择之后,因为它本身总是返回一个值)
你能给我一些例如 MySQL 的示例代码,比如一个包含更新行的主键的列表吗?
我们都知道,在编程语言中,返回值是最基本的东西。但是对于数据库,我们只是不期望任何返回值。这是一个错误的概念,因为它将我们的数据库简化为一个黑匣子。有时知道哪些行受更新影响可能会很好。
那么我们如何构建在插入或更新后返回值的数据库呢?(不是在选择之后,因为它本身总是返回一个值)
你能给我一些例如 MySQL 的示例代码,比如一个包含更新行的主键的列表吗?
您可能想阅读这个相关的 SO 主题(我已链接到@Erwin Brandstetter的答案),在此引用:
在PostgreSQL中,您可以使用该
RETURNING
子句。
Oracle也有一个RETURNING
子句。
SQL-Server有一个OUTPUT
子句。
但是 MySQL 没有这样的东西。
一个好方法是在事务中更新之前选择值:https ://stackoverflow.com/a/10663439/2115135 请记住,更新仍然可能失败,因此在使用返回值之前要考虑它。
根据使用的执行方法,您通常可以获得受在 my sql 数据库上执行的任何写入操作影响的行数。有多种方法,您可以显式地以批处理的形式执行语句
SELECT ROW_COUNT()
最后或者您可以使用连接库提供的功能来获取最后一组中受影响的行数
例如:在 PHP 中,您可以使用
mysqli::$affected_rows
获取受影响的行。
编辑:有没有什么特别的场景,你想要更多的例子吗?
更新:回答问题的第二部分。
好吧,你绝对不可能在我知道的同一条语句中获得受影响行的主键。您将需要执行其他用户给出的答案示例中提到的语句批处理。
编辑根据马库斯在下面的评论中给出的信息修改了答案。
要检索受更新语句影响的每一行的 ID:
SET @uids := null;
UPDATE footable
SET foo = 'bar'
WHERE fooid > 5
AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
这将返回一个字符串,其中所有 ID 用冒号连接。资料来源:如何获取 MySQL 中最后更新行的 ID?
@fenway 给出的答案中提到的另一个选项是支持数据库的输出子句。
请注意,即使在这种情况下,您也必须在按照上述相同步骤发送回数据之前填写值。
现在,我敢肯定,您想知道为什么数据库不自动返回主键值。好吧,这与以下事实有关
1)数据库并不坚持为每个表都拥有一个主键。它实际上是我们定义的唯一约束。
2) 并非所有场景都需要返回受影响的主键。在大多数常用用例中,更新后您最多需要受影响的行。
请记住,关系数据库编程需要与通常的问题集编程略有不同的思维方式。
至少这是我的两分钱。
问候
施瑞亚斯 N
实现此目的的一种方法是使用与更新语句具有相同过滤器的 select 语句。但是,请确保两个查询都在同一个事务中运行,以便数据在每次调用之间不会更改。
{
update Customers set CITY = 'CHICAGO'
where ContactFName = 'Dan'
//execute query
select CustomerID from Customers
where ContactName = 'Dan'
//execute reader
//while the reader returns a row, set that return value to an element in a list
//commit transaction
}//Transaction