有时,一个人可能想要将一些数据从一列移动到另一列。通过移动(在constrast中表示复制),我的意思是在执行操作之前,新列最初是空的,执行操作后旧列应该设置为空。
我有一张表的定义如下:
CREATE TABLE photos(id BIGSERIAL PRIMARY KEY, photo1 BYTEA, photo2 BYTEA);
假设表中有一个条目,其中photo1
包含一些数据,而photo2
是NULL
。我想做一个UPDATE
查询,photo1
变成NULL
,photo2
包含最初在photo1
中的数据。
我发出以下SQL命令(为了简洁起见,省略了WHERE
子句):
UPDATE photos SET photo2 = photo1, photo1 = NULL;
好像很管用。
我也试过这样做:
UPDATE photos SET photo1 = NULL, photo2 = photo1;
这似乎也奏效了。
但它能起作用吗?具体来说,在将photo1
设置为photo1
之前,是否可以将photo2
设置为photo1
,从而导致我在两列中都使用了NULL
?
顺便说一句,当我的UPDATE
很大时,这个标准的BYTEA
语法似乎效率低下,因为photo2
必须逐字节地从photo1
复制,而只要简单地交换指针就够了。也许还有一种我不知道的更有效的方法?
发布于 2017-07-08 21:55:10
这绝对安全。
列- UPDATE
中的引用引用的是旧列,而不是新值。实际上,无法从另一列引用计算出来的新值。
见,例如。
CREATE TABLE x (a integer, b integer);
INSERT INTO x (a,b) VALUES (1,1), (2,2);
UPDATE x SET a = a + 1, b = a + b;
结果:
test=> SELECT * FROM x;
a | b
---+---
2 | 2
3 | 4
..。作业的顺序并不重要。如果你试图把一个值相乘,你就会得到
test=> UPDATE x SET a = a + 1, a = a + 1;
ERROR: multiple assignments to same column "a"
因为如果两个表达式都引用旧的元组值,并且顺序没有意义,那么多次分配给同一列是没有意义的。
但是,为了避免在本例中重写完整的表,我只需要使用旧名称的ALTER TABLE ... ALTER COLUMN ... RENAME ...
然后CREATE
新列。
https://stackoverflow.com/questions/44992802
复制相似问题