我创建新表并向新表中插入 10 条记录,如下所示:
userdb=> CREATE TABLE test_tbl(ID INT PRIMARY KEY, STR VARCHAR);
CREATE TABLE
userdb=> do $$
begin
for r in 1..10 loop
insert into user1.test_tbl(id, str) values(r, r);
end loop;
end;
$$;
DO
userdb=> select * from test_tbl;
id | str
----+-----
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
6 | 6
7 | 7
8 | 8
9 | 9
10 | 10
(10 rows)
userdb=> \set id floor(random()*(10-1+1))+1
userdb=> select :id;
?column?
----------
7
(1 row)
userdb=> select :id;
?column?
----------
1
(1 row)
userdb=> select :id;
?column?
----------
4
(1 row)
userdb=> select :id;
?column?
----------
7
(1 row)
userdb=> UPDATE test_tbl SET str=111 WHERE ID=:id;
UPDATE 1
userdb=> UPDATE test_tbl SET str=222 WHERE ID=:id;
UPDATE 1
userdb=> UPDATE test_tbl SET str=333 WHERE ID=:id;
UPDATE 2
userdb=> select * from test_tbl;
id | str
----+-----
2 | 2
4 | 4
5 | 5
6 | 6
7 | 7
8 | 8
1 | 111
3 | 222
9 | 333
10 | 333
(10 rows)
谁能告诉我为什么最后一次更新会更新多个数据?
您的查询是
Now
random()
是一个易失性函数,也就是说,如果在单个SQL语句中多次调用它,它可能会返回不同的结果。因此,该表达式针对表的每一行floor(random()*(10-1+1))+1
进行计算。因此,可能会出现根本没有找到符合条件的行或找到多于一行的情况。如果您
random()
只想计算一次,经典技巧是使用不相关的子查询,该子查询仅计算一次: