80846


DBに1日専用で使うインデックスを作成、削除したいと思っています。  
インデックスは毎日2つ作り、2つ削除するようなと思っています。phpで作ろうと思って動かしてみたのですがエラーになりました。

[code]

    Query failed: ERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string in ファイル名 行数
    
[/code]

以下がcreate index文です。

[code]

    create index concurrently idx_name1 on table_name(culumn_namea) ;create index concurrently idx_name2 on table_name(cuoumn_nameb);
    
[/code]

create indexはマルチコマンド禁止ということなのでしょうか？


CC BY-SA 4.0
2021-08-16T10:14:44.507
80844
2021-08-16T11:39:05.320
2021-08-16T11:15:05.477
3060
20350
question
sql postgresql
create indexを2つ以上つなげてクエリを流すとエラーになる


`CREATE INDEX CONCURRENTLY` は複数コマンドの中で実行できません。

`CREATE INDEX CONCURRENTLY`
はトランザクションの中で実行できず、また複数コマンドのクエリを指定した際にはそれらの連続実行全体に対してトランザクションが張られます。したがって
`CREATE INDEX CONCURRENTLY` を複数同時にコマンドとして与えてクエリすることはできません。

代わりに、それぞれのコマンドを別々に実行するようにするか、`CREATE INDEX` で良いのであれば `CREATE INDEX`
を使うか、などの方法があります。

### 参考

  * [PostgreSQL 12 インデックスの同時作成](https://www.postgresql.jp/document/12/html/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY)

> 通常の`CREATE INDEX`コマンドはトランザクションブロック内で実行させることができますが、`CREATE INDEX
> CONCURRENTLY`は実行させることができないという相違点があります。

  * [PostgreSQL 12 psql `-c command` オプション](https://www.postgresql.jp/document/12/html/app-psql.html)

> `-c`に渡される各SQLのコマンド文字列は、単一の要求としてサーバに送信されます。
> このため、トランザクションを複数に分ける`BEGIN`/`COMMIT`コマンドが明示的に文字列内に含まれない限り、文字列内に複数のSQLコマンドが含まれていたとしても、サーバはそれを1つのトランザクションとして実行します。


CC BY-SA 4.0
2021-08-16T11:39:05.320
80846
2021-08-16T11:39:05.320
19110
80844
answer