使用自动生成的值更新每一行



我有一个表:

CREATE TABLE "person" (
"ID" NUMBER(38,0), 
"NAME" VARCHAR2(50 CHAR)
)

数据:

id名称1莫尼卡2个空3空4 stephan5空

我需要用值"0"更新空值;人;和自动递增值(从1-人员1、人员2、人员3等(:

1 monica 
2 person1
3 person2
4 stephan
5 person3

我应该使用什么sql(oracle(查询?

不需要分析函数。更新可以这样简单地完成:

UPDATE person
SET NAME = 'person' || ROWNUM
WHERE name IS NULL;

更新

由于个人号码需要与个人ID连续,因此可以使用以下查询:

UPDATE person p
SET p.name =
'person'
|| (SELECT person_number
FROM (SELECT p2.id, ROW_NUMBER () OVER (ORDER BY p2.id) AS person_number
FROM person p2
WHERE name IS NULL)
WHERE id = p.id)
WHERE p.name IS NULL;

您实际上有两个问题,尽管您的问题只涉及其中的一个。您不仅必须"修复数据",还必须"修复系统"。第二个(未处理(是最重要的。有两种方法,我们称之为

  1. 正确的方法
-- update existing data
update person1
set name = 'PERSON' || to_char(rownum,'FM999') 
where id is null;
-- fix the system
alter table person modify name not null; 
  1. 创可贴方法
-- prepare for long term bandaid 
create sequence unknown_person_seq;
-- update existing data
update person
set name = 'PERSON' || to_char(unknown_person_seq.nextval, 'FM99')
where name is null;
select * from person2; 
-- adjust the system
alter table person modify name default 'Person' || to_char(unknown_person_seq.nextval, 'FM99');

不同之处在于正确的方法可以防止系统出现进一步的数据损坏。请参阅此处的演示。为无效数据引发异常比允许或生成虚假数据要好得多。假设您的Person表包含客户信息,并将其称为PERSON4。他们将成为您的客户多久?

有效:

SET
name = (
SELECT n
FROM(
SELECT
id, 'person' || ROW_NUMBER() OVER (ORDER BY id) AS n
FROM
person
WHERE
name IS NULL
)u
WHERE
u.id = person.id)
WHERE
NAME IS NULL

最新更新