PostgreSQL 38001: containing_sql_not_permitted 报错 故障修复 远程处理
文档解释
38001: containing_sql_not_permitted
。
Containing SQL Not Permitted是PostgreSQL的一种常见错误,可能出现在用户在建立新表时。主要原因是PostgreSQL不允许在创建表时执行sql语句,而只允许执行普通SQL语句,这是由复杂查询结构和在PostgreSQL中使用数据类型的缺陷导致的。
常见案例:
在PostgreSQL中,用户会出现Containing SQL Not Permitted错误,当他们在建立新表时试图在列定义中写入SQL语句的情况。以下是一个仅表示目的的范例,其中包含执行Select Statements的SQL语句:
CREATE TABLE test_tbl (
product_id INTEGER,
name TEXT,
quantity INTEGER,
description TEXT
price INTEGER AS (SELECT MAX(price) FROM product WHERE product_id = test_tbl.product_id)
);
在这种情况下,以上 SQL语句将返回Containing SQL Not Permitted错误,其原因是PostgreSQL不允许在列定义中执行SQL语句。
解决方法:
用户可以通过两种方法解决Containing SQL Not Permitted错误。
首先,用户可以使用普通的INSERT-SELECT语句来将数据插入到新表中。例如,以下示例在创建新表之后加载数据:
— Create the New Table
CREATE TABLE new_tbl (
product_id INTEGER,
name TEXT,
quantity INTEGER,
description TEXT,
price INTEGER
);
— Load the Data
INSERT INTO new_tbl (product_id, name, quantity, description, price)
SELECT product_id, name, quantity, description, MAX(price)
FROM product WHERE product_id = new_tbl.product_id;
其次,也可以使用内置的PostgreSQL函数进行列定义,例如以下示例(使用以下语法):
— Create the New Table
CREATE TABLE new_tbl (
product_id INTEGER,
name TEXT,
quantity INTEGER,
description TEXT,
price INTEGER DEFAULT (SELECT MAX(price) FROM product WHERE product_id = new_tbl.product_id)
);
从以上例子可以看出,使用以上两种方法可以为用户提供一个简单,有效的解决方案,解决Containing SQL Not Permitted错误。