我有两个文件在Postgres中执行时都可以正常工作。
文件1
CREATE TABLE ContractStatusEnum (
id SERIAL PRIMARY KEY,
description VARCHAR(4000) NOT NULL
);
* 文件2
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 $$
但是,如果我只是将它们放在一个文件中,它就会失败
错误:“DO”处或附近的语法错误
第6行:DO $$ BEGIN
在MS SQL上,我可以通过在两个脚本之间放置GO
语句来创建新的上下文来解决这个问题。任何线索如何在Postgres 9中做到这一点?
答案 0 :(得分:3)
您需要使用分号终止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 block)中:
psql (9.1.3)
Type "help" for help.
postgres=> \i f1.sql
CREATE TABLE
postgres=> \i f2.sql
DO
postgres=>
答案 1 :(得分:2)
只是连接片段。不需要/或GO
。 (在psql的交互模式下,可能需要 )
CREATE TABLE ContractStatusEnum (
id SERIAL PRIMARY KEY,
description VARCHAR(4000) NOT NULL
);
-- File 2
INSERT INTO ContractStatusEnum (id, description) VALUES
(1, 'Ordered'),
(2, 'Active'),
(3, 'Stopped'),
(4, 'Canceled'),
(10, 'Inactive')
;
编辑:删除了WHERE子句(这里它甚至没有效果)表上的PK约束无论如何都会避免多次初始化。
另一种连接方式是通过包含。您可以创建“主”脚本,并从中包含片段。当你想“评论”整个部分时,它会派上用场。
-- Master script.
\i tables_create.sql
\i procedures_and_functions.sql
\i populate_the_tables.sql
\i do_some_checks.sql
-- EOF