ERROR: integer out of range In postgresql
ERROR: integer out of range In postgresql
下面是我的 table 架构(我使用的是 PostgreSQL 9.6.1)
my_table
------------
table_id SERIAL PRIMRY KEY,
A1 INTEGER,
A2 INTEGER,
A3 INTEGER,
A4 INTEGER,
A5 INTEGER,
A6 INTEGER,
A7 INTEGER,
A8 INTEGER,
A9 INTEGER,
A10 INTEGER,
A11 INTEGER,
A12 INTEGER,
A13 INTEGER,
A14 INTEGER,
A15 INTEGER,
A16 DOUBLE PRECISION,
A17 DOUBLE PRECISION
我正在尝试 运行 下面的查询以创建新的 table。
CREATE TABLE my_table_2 AS
SELECT
B1 AS C1
B3 AS C2,
B5 AS C3,
B7 AS C4 ,
B9 AS C5,
B11 AS C6 ,
B1 / CAST( NULLIF(B3, 0) AS FLOAT) AS C7,
B1 / CAST( NULLIF(B5, 0) AS FLOAT) AS C8,
B1 / CAST( NULLIF(B7, 0) AS FLOAT) AS C9,
B1 / CAST( NULLIF(B9, 0) AS FLOAT) AS C10,
B1 / CAST( NULLIF(B11, 0) AS FLOAT) AS C11,
B3 / CAST( NULLIF(B5, 0) AS FLOAT) AS C12,
B5 / CAST( NULLIF(B7, 0 )* NULLIF(B9,0) AS FLOAT) AS C13,
B2 AS C14 ,
B4 AS C15,
B6 AS C16,
B8 AS C17,
B10 AS C18,
B12 AS C19,
B2 / CAST(NULLIF(B4, 0) AS FLOAT) AS C20,
B2 / CAST(NULLIF(B6, 0) AS FLOAT) AS C21,
B2 / CAST(NULLIF(B8, 0) AS FLOAT) AS C22,
B2 / CAST(NULLIF(B10, 0) AS FLOAT) AS C23,
B2 / CAST(NULLIF(B12 , 0) AS FLOAT) AS C24
B4 / CAST(NULLIF(B6 , 0) AS FLOAT) AS C25
B6 / CAST(NULLIF(B8,0) * NULLIF( B10,0) AS FLOAT) AS C26
0.0 AS C27,
0.0 AS C28,
0.0 AS C29,
0.0 AS C30,
0.0 AS C31,
0.0 AS C32,
0.0 AS C33,
0.0 AS C34,
0.0 AS C35,
0.0 AS C36,
0.0 AS C37,
0.0 AS C38,
0.0 AS C39,
B13 AS C40
B14 AS C41,
B15 AS C42
FROM (
SELECT
table_id,
A1 - A2 + A3 AS B1,
A1 AS B2,
A4 - A5 AS B3,
A4 AS B4,
A6 - A7 AS B5,
A6 AS B6,
A8 - A9 AS B7,
A8 AS B8,
A10 - A11 AS B9,
A10 AS B10,
A12 - A13 AS B11,
A12 AS B12,
A14 AS B13,
A15 AS B14,
coalesce(coalesce(A16 * 100, 0) / NULLIF(A17, 0), 0) AS B15
FROM my_table
) v1;
我运行使用psql
命令将上述查询作为后台进程
使用下面的命令
sudo -u postgres psql My_DB -X -a -f /tmp/test.sql > result.out 2>result.err &
因为 my_table 是一个非常大的 table。但是过了一段时间,当我检查 result.err 文件时。它只有一行
ERROR: integer out of range
对于 WHere 子句中的某些示例 ID,table 生成时没有任何问题,但是当我 运行 整个 table 出现上述错误时。
任何人都可以解释为什么会发生这种情况以及我该如何解决这个问题?
任何 +
或 -
操作都可能导致此错误,但最可能的原因是 A16 * 100
.
您可以通过避免导致溢出的操作来解决问题,或者您可以选择 numeric
或 bigint
等具有更广泛值范围的数据类型。
检查乘法
NULLIF(B7, 0 )* NULLIF(B9,0)
和
NULLIF(B8,0) * NULLIF( B10,0)
尝试更换计算顺序,先除法,再乘法
( B5 / NULLIF(B7, 0) ) * NULLIF(B9,0) AS B15
( B6 / NULLIF(B8, 0) ) * NULLIF(B10,0) AS C26
下面是我的 table 架构(我使用的是 PostgreSQL 9.6.1)
my_table
------------
table_id SERIAL PRIMRY KEY,
A1 INTEGER,
A2 INTEGER,
A3 INTEGER,
A4 INTEGER,
A5 INTEGER,
A6 INTEGER,
A7 INTEGER,
A8 INTEGER,
A9 INTEGER,
A10 INTEGER,
A11 INTEGER,
A12 INTEGER,
A13 INTEGER,
A14 INTEGER,
A15 INTEGER,
A16 DOUBLE PRECISION,
A17 DOUBLE PRECISION
我正在尝试 运行 下面的查询以创建新的 table。
CREATE TABLE my_table_2 AS
SELECT
B1 AS C1
B3 AS C2,
B5 AS C3,
B7 AS C4 ,
B9 AS C5,
B11 AS C6 ,
B1 / CAST( NULLIF(B3, 0) AS FLOAT) AS C7,
B1 / CAST( NULLIF(B5, 0) AS FLOAT) AS C8,
B1 / CAST( NULLIF(B7, 0) AS FLOAT) AS C9,
B1 / CAST( NULLIF(B9, 0) AS FLOAT) AS C10,
B1 / CAST( NULLIF(B11, 0) AS FLOAT) AS C11,
B3 / CAST( NULLIF(B5, 0) AS FLOAT) AS C12,
B5 / CAST( NULLIF(B7, 0 )* NULLIF(B9,0) AS FLOAT) AS C13,
B2 AS C14 ,
B4 AS C15,
B6 AS C16,
B8 AS C17,
B10 AS C18,
B12 AS C19,
B2 / CAST(NULLIF(B4, 0) AS FLOAT) AS C20,
B2 / CAST(NULLIF(B6, 0) AS FLOAT) AS C21,
B2 / CAST(NULLIF(B8, 0) AS FLOAT) AS C22,
B2 / CAST(NULLIF(B10, 0) AS FLOAT) AS C23,
B2 / CAST(NULLIF(B12 , 0) AS FLOAT) AS C24
B4 / CAST(NULLIF(B6 , 0) AS FLOAT) AS C25
B6 / CAST(NULLIF(B8,0) * NULLIF( B10,0) AS FLOAT) AS C26
0.0 AS C27,
0.0 AS C28,
0.0 AS C29,
0.0 AS C30,
0.0 AS C31,
0.0 AS C32,
0.0 AS C33,
0.0 AS C34,
0.0 AS C35,
0.0 AS C36,
0.0 AS C37,
0.0 AS C38,
0.0 AS C39,
B13 AS C40
B14 AS C41,
B15 AS C42
FROM (
SELECT
table_id,
A1 - A2 + A3 AS B1,
A1 AS B2,
A4 - A5 AS B3,
A4 AS B4,
A6 - A7 AS B5,
A6 AS B6,
A8 - A9 AS B7,
A8 AS B8,
A10 - A11 AS B9,
A10 AS B10,
A12 - A13 AS B11,
A12 AS B12,
A14 AS B13,
A15 AS B14,
coalesce(coalesce(A16 * 100, 0) / NULLIF(A17, 0), 0) AS B15
FROM my_table
) v1;
我运行使用psql
命令将上述查询作为后台进程
使用下面的命令
sudo -u postgres psql My_DB -X -a -f /tmp/test.sql > result.out 2>result.err &
因为 my_table 是一个非常大的 table。但是过了一段时间,当我检查 result.err 文件时。它只有一行
ERROR: integer out of range
对于 WHere 子句中的某些示例 ID,table 生成时没有任何问题,但是当我 运行 整个 table 出现上述错误时。
任何人都可以解释为什么会发生这种情况以及我该如何解决这个问题?
任何 +
或 -
操作都可能导致此错误,但最可能的原因是 A16 * 100
.
您可以通过避免导致溢出的操作来解决问题,或者您可以选择 numeric
或 bigint
等具有更广泛值范围的数据类型。
检查乘法
NULLIF(B7, 0 )* NULLIF(B9,0)
和
NULLIF(B8,0) * NULLIF( B10,0)
尝试更换计算顺序,先除法,再乘法
( B5 / NULLIF(B7, 0) ) * NULLIF(B9,0) AS B15
( B6 / NULLIF(B8, 0) ) * NULLIF(B10,0) AS C26