Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 将多个postgres脚本合并到一个文件中_Postgresql - Fatal编程技术网

Postgresql 将多个postgres脚本合并到一个文件中

Postgresql 将多个postgres脚本合并到一个文件中,postgresql,Postgresql,我有两个文件,它们在Postgres中执行时都可以正常工作 文件1 CREATE TABLE ContractStatusEnum ( id SERIAL PRIMARY KEY, description VARCHAR(4000) NOT NULL ); *文件2 但是,如果我只是将它们放在一个文件中,它将失败 错误:在“DO”处或附近出现语法错误 第6行:$$开始吗 在MS SQL上,我可以通过在两个脚本之间放置GO语句来创建新的上

我有两个文件,它们在Postgres中执行时都可以正常工作

文件1

CREATE TABLE ContractStatusEnum (
    id              SERIAL PRIMARY KEY,
    description         VARCHAR(4000) NOT NULL
);
*文件2

但是,如果我只是将它们放在一个文件中,它将失败

错误:在“DO”处或附近出现语法错误
第6行:$$开始吗


在MS SQL上,我可以通过在两个脚本之间放置
GO
语句来创建新的上下文来解决这个问题。有没有关于如何在Postgres 9中执行此操作的线索?

只需将片段连接起来即可。不需要/或
GO
。(在psql的交互模式下,可能需要一个\g)

编辑:删除WHERE子句(此处甚至无效)。表上的PK约束将避免多次初始化

另一种连接方式是通过包含。您可以创建一个“主”脚本,并从中包含片段。当您想“注释”整个部分时,它很有用

-- Master script.

\i tables_create.sql
\i procedures_and_functions.sql
\i populate_the_tables.sql
\i do_some_checks.sql

-- EOF

只需连接片段。不需要/或
GO
。(在psql的交互模式下,可能需要一个\g)

编辑:删除WHERE子句(此处甚至无效)。表上的PK约束将避免多次初始化

另一种连接方式是通过包含。您可以创建一个“主”脚本,并从中包含片段。当您想“注释”整个部分时,它很有用

-- Master script.

\i tables_create.sql
\i procedures_and_functions.sql
\i populate_the_tables.sql
\i do_some_checks.sql

-- EOF

您需要用分号终止
DO

以下是我的作品:

DO $$ BEGIN

    IF NOT EXISTS (SELECT * FROM ContractStatusEnum WHERE id = 1) THEN
    INSERT INTO ContractStatusEnum (id, description) VALUES
        (1, 'Ordered'),
        (2, 'Active'),
        (3, 'Stopped'),
        (4, 'Canceled'),
        (10, 'Inactive');
    END IF;
END $$
;
我将语句保存在f1.sql(创建表)和f2.sql(do块)中:


您需要用分号终止
DO

以下是我的作品:

DO $$ BEGIN

    IF NOT EXISTS (SELECT * FROM ContractStatusEnum WHERE id = 1) THEN
    INSERT INTO ContractStatusEnum (id, description) VALUES
        (1, 'Ordered'),
        (2, 'Active'),
        (3, 'Stopped'),
        (4, 'Canceled'),
        (10, 'Inactive');
    END IF;
END $$
;
我将语句保存在f1.sql(创建表)和f2.sql(do块)中:


Do
仅在pgplsql中有效。你可以省略do。只需连接片段(可能每个语句都以分号结尾。
IF NOT EXISTS
语法无效:请改用WHERE子句。
IF NOT EXISTS
语句在postgres中执行第二个文件时运行良好,无需连接。
语句是否应在pgplsql中运行完整脚本?是的,您甚至可以将stdin重定向到psql并使用管道或“
Do
仅在pgplsql中有效。您可以省略Do。只需连接片段即可(可能每个语句都以分号结尾。
IF NOT EXISTS
语法无效:请改用WHERE子句。
IF NOT EXISTS
语句在postgres中执行第二个文件时运行良好,无需连接。
语句是否应在pgplsql中运行完整脚本?是的,您甚至可以将stdin重定向到psql并使用管道或“我知道我可以通过省略pgplsql来摆脱它,但我有更复杂的脚本需要在该模式下运行。我认为pgplsql在过程/函数之外是无效的。我当然不想要它。@wildplasser:它在
DO
blockOops中肯定是有效的。我得到了纠正。我从未使用过它;插入将失败。”由于PK约束。(这似乎是一个表创建+初始化脚本)我知道我可以通过省略pgplsql来摆脱它,但我有更复杂的脚本需要在该模式下运行。我认为pgplsql在过程/函数之外是无效的。我当然不想要它。@wildplasser:它在
DO
blockOops中肯定是有效的。我得到了纠正。我从未使用过它;插入将失败PK约束的原因。(这似乎是表创建+初始化脚本)
psql (9.1.3)
Type "help" for help.

postgres=> \i f1.sql
CREATE TABLE
postgres=> \i f2.sql
DO
postgres=>