sql - 将 varchar 类型的 postgres 字段转换为数字

标签 sql postgresql

我有查询要修改 postgres 中超过 200 万条记录。
问题是其中一个字段的类型为 VARCHAR,我需要对其进行一些数学运算。现在我正在将字段转换为数字,如下所示:-

CAST(attribute as numeric)

整个查询大约需要 4 个小时才能运行。
我正在寻找缩短执行时间的方法。在执行查询之前,我可以先将字段类型从 varchar 更改为 numeric 吗?我不能使用 alter table alter column type 来执行此操作。

最佳答案

如果您不能长时间阻塞读取表,毫无疑问,最好的方法是创建“第二个”表并进行后续更新,如@OMG Ponies 所说。

此外,尝试禁用触发器,如果​​它们中的任何一个会用新值做某事(例如:日志的触发器,因为我们不会改变它自己的“值”)。这可以大大提高性能,具体取决于触发器的作用。

像这样:

-- STEP 1: CREATING SECOND TABLE
START TRANSACTION;
CREATE TABLE MY_SECOND_TABLE AS SELECT <YOURKEYFIELDNAME>, (ATTRIBUTE AS NUMERIC) AS ATTRIBUTE FROM MY_TABLE;    
CREATE UNIQUE INDEX UI_MY_SECOND_TABLE ON MY_SECOND_TABLE (<YOURKEYFIELDNAME>);
COMMIT;

-- STEP 2: UPDATING A SOURCE TABLE
START TRANSACTION;
ALTER TABLE MY_TABLE DISABLE TRIGGER ALL;
ALTER TABLE MY_TABLE DROP COLUMN ATTRIBUTE;
ALTER TABLE ATTRIBUTE ADD ATTRIBUTE INTEGER;
UPDATE MY_TABLE T SET ATTRIBUTE = (SELECT ATTRIBUTE FROM MY_SECOND_TABLE T2 WHERE T2.<YOURKEYFIELDNAME> = T.<YOURKEYFIELDNAME>);    
ALTER TABLE MY_TABLE ENABLE TRIGGER ALL;
COMMIT;

-- DROP SECOND TABLE
DROP TABLE MY_SECOND_TABLE;

关于sql - 将 varchar 类型的 postgres 字段转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575868/

相关文章:

mysql - 计算查询中的总项目数

mysql - 带有引用 MySQL 中同一个表的子查询的 SQL UPDATE

sql - 在 PostgreSQL 中如何确保只有当新的 modified_at 大于当前的 modified_at 时才更新表?

postgresql - JOOQ 不从 PostgreSql 生成表值重载过程

java - Apache Derby 中的 REPLACE 函数

mysql - 避免在 Avg 组中使用临时值

postgresql - 如何在动态 sql 查询中使用 WITH block

ruby-on-rails - Rails 应用程序保持这么多空闲的 Puma 和 Postgres 连接是否正常?

postgresql - 如何从格式为 n.n.n.n 的 ltree 中进行选择并在每个级别按数字排序?

c# - 如何获取表的主键列(如果是复合主键)