首页 > 解决方案 > 具有限制的 Postgres 更新表

问题描述

当我将限制与更新语句一起使用时,Postgres 失败

我只想更新表的第一条记录

UPDATE test1 SET name="user101" LIMIT 1;

当我使用限制时,这在 postgres 中失败;

我可以做这个

UPDATE test1 SET name="user101" 
WHERE ID =(SELECT ID FROM test1 LIMIT 1) 

但是要使用上面的 sql,我应该知道列名(ID)并且在我的情况下我无权访问列名。

我需要一个不需要列名但只更新第一条记录的 sql 语句。

更新:

我正在使用 ruby@db.exec(query)​​ 执行查询

我们将如下不同的 sql 语句传递给调用的方法@db.exec(query)

  1. 更新 table1 设置 t1_name = "123" 限制 1;
  2. 更新表2设置一些东西=“xyz”限制1;
  3. 更新 table3 设置 som = "abc" 限制 1;

现在在打电话之前@db.exec(query)

我想修改查询,使查询不会使用limit

在这种情况下,我可以访问要更新的表名、列名。但我无权访问任何其他列名 (ID)。

标签: postgresql

解决方案


虽然我认为这种方法有一种非常难闻的味道(什么样的应用程序将随机行的更新发送到数据库),但您可以使用ctid始终可用的内部列。

UPDATE test1 
  SET name = 'user101' 
WHERE ctid = (SELECT ctid FROM test1 LIMIT 1) 

推荐阅读