【问题标题】:Update every row with auto-generated value使用自动生成的值更新每一行
【发布时间】:2021-01-14 07:24:43
【问题描述】:

我有一张桌子:

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

数据:

身份证名称 1莫妮卡 2 空 3 空 4 斯蒂芬 5 空

我需要使用值“person”和自动递增值(从 1 - person1、person2、person3 等)更新空值:

1 monica 
2 person1
3 person2
4 stephan
5 person3

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

【问题讨论】:

  • 您能否提供有关您的表结构的更多详细信息?前任。提供一个 CREATE TABLE 脚本,向我们展示列名和数据类型等。
  • 此栏目还有其他栏目要订购吗?
  • 顺便说一下,将表命名为"person"(用双引号括起来)并不是一个好主意。 person(不带引号)会更容易使用。

标签: sql oracle sql-update dml


【解决方案1】:

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

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;

【讨论】:

  • 如果我的回答成功回答了你的问题,请将答案标记为正确答案,以免其他人继续提交答案。
  • 不幸的是,我刚刚意识到它不能正常工作,有时情人 id 的行有更大的数字,就像这样。 1 莫妮卡 2 人 1 3 人 3 4 斯蒂芬 5 人 2
  • 问题是当我这样做时:select id, rownum from person order by id, 然后 rownum 不按顺序排列(id1, rownum3, id2 rownum2 等)
  • 刚刚添加了一个可以纠正您的问题的更新。
【解决方案2】:

您实际上有 2 个问题,尽管您的问题只解决了其中 1 个问题。您不仅必须“修复数据”,还必须“修复系统”。第二个(未解决的)是最重要的。有两种方法,让我们调用它们

  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');

不同之处在于正确的方法可以防止系统进一步损坏数据。见demo here。为无效数据引发异常比允许或生成虚假数据要好得多。考虑您的 Person 表包含客户信息,您将它们称为 PERSON4。他们会成为您的客户多久?

【讨论】:

  • 客户是否被删除无关紧要。这只是自动生成的唯一名称以避免 Null。从这一刻起非空字段,我只需要填写空值
【解决方案3】:

有效:

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

【讨论】:

    猜你喜欢
    • 2022-09-30
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2021-11-22
    • 2014-01-04
    • 1970-01-01
    • 2016-05-01
    • 2010-10-09
    相关资源
    最近更新 更多