如何更新oracle中列的所有行,起始值为500,并在oracle中递增(how to update all rows of a column in oracle with a start value of 500 and incrementing in oracle)
我在oracle中有一个表,其中列的所有行必须用500的起始值更新并且递增1。
我试图在网上找到类似的东西,但无法获得任何有用的东西。 oracle和PL / SQL不是我的专长。 任何帮助,将不胜感激。
I have a table in oracle of which all rows of a column has to be updated with a starting value of 500 and incrementing by 1.
I tried to find something similar online but wasn't able to get anything useful. oracle and PL/SQL is not my expertise. any help would be appreciated.
原文:https://stackoverflow.com/questions/29225376
更新时间:2019-12-07 20:47
最满意答案
我不会使用PL / SQL,因为它可以在普通的SQL中完成。
您可以使用从500开始并递增1的SEQUENCE 。
例如,
建立
SQL> DROP SEQUENCE s ;
Sequence dropped.
SQL>
SQL> CREATE SEQUENCE s START WITH 500 INCREMENT BY 1;
Sequence created.
SQL>
SQL> DROP TABLE t PURGE;
Table dropped.
SQL>
SQL> CREATE TABLE t AS SELECT LEVEL id FROM dual CONNECT BY LEVEL < =20;
Table created.
SQL>
SQL> SELECT * FROM t;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
ID
----------
12
13
14
15
16
17
18
19
20
20 rows selected.
SQL>
现在,让我们用序列 更新表格。
SQL> UPDATE t SET ID = s.nextval;
20 rows updated.
SQL>
SQL> SELECT * FROM t;
ID
----------
500
501
502
503
504
505
506
507
508
509
510
ID
----------
511
512
513
514
515
516
517
518
519
20 rows selected.
SQL>
所以,你用500开始的序列更新所有的行,然后加1。
I won't use PL/SQL since it could be done in plain SQL.
You could use a SEQUENCE starting with 500 and incremented by 1.
For example,
set up
SQL> DROP SEQUENCE s ;
Sequence dropped.
SQL>
SQL> CREATE SEQUENCE s START WITH 500 INCREMENT BY 1;
Sequence created.
SQL>
SQL> DROP TABLE t PURGE;
Table dropped.
SQL>
SQL> CREATE TABLE t AS SELECT LEVEL id FROM dual CONNECT BY LEVEL < =20;
Table created.
SQL>
SQL> SELECT * FROM t;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
ID
----------
12
13
14
15
16
17
18
19
20
20 rows selected.
SQL>
Now, let's update the table with the sequence.
SQL> UPDATE t SET ID = s.nextval;
20 rows updated.
SQL>
SQL> SELECT * FROM t;
ID
----------
500
501
502
503
504
505
506
507
508
509
510
ID
----------
511
512
513
514
515
516
517
518
519
20 rows selected.
SQL>
So, you have all the rows updated with the sequence starting with 500 and incremented by 1.
2015-03-24
相关问答
我将回答我的问题并解释我是如何克服这个障碍的。 最后,我基本上做了'a_horse_with_no_name'的建议。 我没有使用resultSet游标或引用游标来执行更新,而是使用了一个简单的UPDATE语句。 这是可能的,因为我能够说服DBA为唯一标识符创建列。 我们永远无法解决由resultSet的updateRow()方法引起的异常。 在添加唯一标识符之前,没有可靠地使用UPDATE语句的密钥。 以下是updateSQL是包含更新SQL语句的字符串的代码: updateResultInt
...
我不会使用PL / SQL,因为它可以在普通的SQL中完成。 您可以使用从500开始并递增1的SEQUENCE 。 例如, 建立 SQL> DROP SEQUENCE s ;
Sequence dropped.
SQL>
SQL> CREATE SEQUENCE s START WITH 500 INCREMENT BY 1;
Sequence created.
SQL>
SQL> DROP TABLE t PURGE;
Table dropped.
SQL>
SQL> CREATE
...
由于子查询中的where子句与外部相同,因此不需要子查询直接引用列 UPDATE LOAD_SETTINGS
SET
LOADDATE = UPDATEDATE
WHERE
MODEL = 'A001'
AND OBJECT = 'A';
Since the where clause on the subquery is the same where on the outer there's no need for the subselect just reference t
...
在没有更新任何内容的更新之后没有持有行锁(毕竟,如果没有行,应该锁定哪一行?) 您的事务仍然会有一些共享锁(在表上),但那些只是为了防止其他事务更改表。 它基本上与select语句在表上获得的“锁定”类型相同。 从手册 : 只有在编写器修改时才会锁定行。 在手册中进一步说明 : 行锁(也称为TX锁)是单行表的锁。 事务为每个修改的行获取行锁 因此,如果没有更改行,则无法锁定。 No row locks are held after an update that didn't update anyt
...
您的select语句比它需要的更复杂,您将以这种方式获得相同的集合: SELECT emp.employee_id,min(bo.booking_date) booking_date
FROM employee emp
LEFT JOIN booking bo
ON bo.employee_id = emp.employee_id
WHERE emp.joining_date is NULL
GROUP BY emp.employee_id;
您的更新可以像这样完成,请注意“and e
...
我会问一个物理表是否是正确的机制,无论你在做什么。 一个因素是如何处理交易。 任何意味着“不要在交易期间锁定”的东西都会遇到交易问题。 有几个非交易选项: 全局上下文值可能很有用(取决于您是否在RAC上)以及如何在重新启动后处理持久性。 另一个选项是DBMS_PIPE ,您可以在其中维护该表的后台进程,并且单独的会话将消息发送到该进程,而不是直接更新表。 排队是另一种想法。 如果您只需要减少锁定记录的时间,那么自主事务可能就是答案 I'd ask whether a physical table
...
我想你正在寻找这个正则表达式: SELECT *
FROM table_name
WHERE regexp_like(column_Name,'^[0-9]')
或简而言之 SELECT *
FROM table_name
WHERE regexp_like(column_Name,'^\d')
你所做的是否定括号中元素的结果, ^需要在括号之前 i guess you are looking for this regex: SELECT *
FROM table_name
WHERE
...
您可以将MERGE与窗口函数row_number : merge into your_table t
using (
select t.*,
row_number() over (partition by testId order by rank) as rn
from your_table t
) s on (
t.rank = s.rank
and t.testId = s.testId
)
when matched then upda
...