【问题标题】:Can't update only 1 row. How to change 1 row?不能只更新 1 行。如何更改 1 行?
【发布时间】:2022-01-05 14:18:05
【问题描述】:

我发现 Oracle 不支持 LIMIT 子句不像 MySQL 并且只更新表中的 1 行我试过这个:

UPDATE "Schedule" 
   SET "Position" = 'Manager' 
 WHERE "Position" IN 
       (SELECT "Position" 
          FROM "Schedule" 
         WHERE "Position"='Tester' 
         OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY);

并更新了 3 行。

当我运行这个时:

SELECT "Position" 
  FROM "Schedule" 
 WHERE "Position"='Tester' 
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;

我只得到一行(应该如此)。

但是正如我之前提到的那样,更新 1 行不起作用。还有其他方法可以只更新 1 个特定行吗?

【问题讨论】:

标签: sql oracle sql-update sql-limit


【解决方案1】:

只要您的数据库版本至少为12c,您只需要一点点,通过将WHERE Position IN (SELECT Position 部分替换为WHERE ID IN (SELECT ID 来更改为具有主列。当前的情况没有意义,因为所有测试人员都将转换为经理,甚至将IN <subquery> 替换为='Tester'。所以通过删除双引号使用以下更新语句

UPDATE Schedule
   SET Position = 'Manager'
 WHERE ID IN
       (SELECT ID
          FROM Schedule
         WHERE Position = 'Tester'
         FETCH NEXT 1 ROW ONLY);

Demo

【讨论】:

  • 我得到这个错误.. ORA-00904: "ID": invalid identifier
  • 你的数据库版本是多少? @a_needs_help
  • 版本是这个((19c
  • 您是否删除了双引号 @a_needs_help ?顺便说一句,你有主键列吗?
  • 非常感谢,我找到了问题所在:)
【解决方案2】:

理想情况下,您的"Schedule" 表应该有一个主键,您可以使用它来执行更新。假设 "Schedule" 没有主键,您可以使用 ROWID:

UPDATE "Schedule" 
  SET "Position" = 'Manager' 
  WHERE ROWID IN (SELECT ROWID
                    FROM "Schedule" 
                    WHERE "Position" = 'Tester' 
                    OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY);

请注意,像这样使用 ROWID 是非常糟糕的做法,并且所有表都应该在创建时指定一个主键,以便可以可靠地找到各个行。要使一列或一组列成为有效的主键,它们必须是 A) 非 NULL、B) 唯一且 C) 不变。

另外 - 我强烈建议您养成使用不需要引用的表和列的名称的习惯。带引号的标识符是语法错误的机会,这些错误无助于改善您的生活。如果您创建一个名为 SCHEDULE 的表,您仍然可以将其引用为 ScheduleScHeDuLeschedule,或您希望在代码中使用的任何其他大小写字母组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多