不能只更新 1 行。如何更改 1 行?
Can't update only 1 row. How to change 1 row?
我发现 Oracle 不支持 LIMIT
子句,这与 MySQL 不同,并且只更新 table 中的 1 行 i'我试过这个:
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 个特定行?
只要您的数据库版本至少为 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);
理想情况下,您的 "Schedule"
table 会有一个主键,您将使用它来执行更新。假设 "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 是一种非常糟糕的做法,所有 table 都应在创建时指定一个主键,以便可以可靠地找到各个行。要使一列或一组列成为有效的主键,它们必须是 A) 非 NULL,B) 唯一,以及 C) 不变。
此外 - 我强烈建议您养成使用 table 和不需要引用的列的名称的习惯。带引号的标识符是出现语法错误的机会,这些错误无助于让您的生活更美好。如果您创建一个名为 SCHEDULE
的 table,您仍然可以将其称为 Schedule
、ScHeDuLe
、schedule
或任何其他大小写字母组合您愿意在代码中使用。
我发现 Oracle 不支持 LIMIT
子句,这与 MySQL 不同,并且只更新 table 中的 1 行 i'我试过这个:
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 个特定行?
只要您的数据库版本至少为 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);
理想情况下,您的 "Schedule"
table 会有一个主键,您将使用它来执行更新。假设 "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 是一种非常糟糕的做法,所有 table 都应在创建时指定一个主键,以便可以可靠地找到各个行。要使一列或一组列成为有效的主键,它们必须是 A) 非 NULL,B) 唯一,以及 C) 不变。
此外 - 我强烈建议您养成使用 table 和不需要引用的列的名称的习惯。带引号的标识符是出现语法错误的机会,这些错误无助于让您的生活更美好。如果您创建一个名为 SCHEDULE
的 table,您仍然可以将其称为 Schedule
、ScHeDuLe
、schedule
或任何其他大小写字母组合您愿意在代码中使用。