我试图为现有表中的每一行生成一个 uuid,并为两个不同的列设置相同的值。
我写了一个更新语句,我认为应该这样做,但它为每个列设置了不同的uuid。为什么?
CREATE TABLE tbl (
n number,
r1 raw(32),
r2 raw(32)
);
insert into tbl (n) values (1);
insert into tbl (n) values (2);
insert into tbl (n) values (3);
update (select r1, r2, sys_guid() as uuid FROM tbl)
set r1 = uuid, r2 = uuid;
select n, rawtohex(r1), rawtohex(r2) from tbl;
Run Code Online (Sandbox Code Playgroud)
| 氮 | RAWTHEX(R1) | RAWTHEX(R2) |
|---|---|---|
| 1 | F89B6F66D7C7A52FE050020A02583951 | F89B6F66D7C8A52FE050020A02583951 |
| 2 | F89B6F66D7C9A52FE050020A02583951 | F89B6F66D7CAA52FE050020A02583951 |
| 3 | F89B6F66D7CBA52FE050020A02583951 | F89B6F66D7CCA52FE050020A02583951 |
这是与这个问题和这个问题相同的问题,因为SYS_GUID函数调用没有在子查询中具体化,而是被推送到更新语句并每行调用两次(每列一次);然而,这些问题的答案并不完全适用于UPDATE声明。
相反,您可以使用MERGE语句:
MERGE INTO tbl d
USING (
SELECT ROWID AS rid,
SYS_GUID() AS uuid
FROM tbl s
) s
ON (s.rid = d.ROWID)
WHEN MATCHED THEN
UPDATE
SET d.r1 = uuid,
d.r2 = uuid;
Run Code Online (Sandbox Code Playgroud)
在 后MERGE,您的示例数据可能包含:
| 氮 | RAWTHEX(R1) | RAWTHEX(R2) |
|---|---|---|
| 1 | F89CAC01141C1982E053182BA8C018B2 | F89CAC01141C1982E053182BA8C018B2 |
| 2 | F89CAC01141D1982E053182BA8C018B2 | F89CAC01141D1982E053182BA8C018B2 |
| 3 | F89CAC01141E1982E053182BA8C018B2 | F89CAC01141E1982E053182BA8C018B2 |
另一种方法是使用两个UPDATE语句:
UPDATE tbl
SET r1 = SYS_GUID();
UPDATE tbl
SET r2 = r1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |