vyx02237
@vyx02237 (樋口 佳之)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

標準sql ではテーブル別名に予約語使用が可能なのでしょうか。

解決したいこと

予約語をテーブル名等々に利用すべきではないとの事は良く目にするのですが、
標準sql ではテーブル別名に予約語使用が可能なのでしょうか。
試しているのはpostgresql ver 11 系です。

発生している問題・エラー

begin;
insert into table_a
select *
from table_b
commit;

問題というか、これが正しく動作しているように見えてしまって手間取りました。
構文エラー報告されず、なぜかcommitしてない。commitがテーブルへの別名と解釈されているようです。

本来書くべきであったsql

begin;
insert into table_a
select *
from table_b;
commit;

テーブル別名にsql予約語使用(試したのはcommitのみですけど)は可能。


select *
from table_b
commit
where commit.id > 1;

テーブル別名予約語禁止の約束があればエラーのセミコロンもっと速く気づいたと思うのですが、
何か理由があって禁止されていないのでしょうか。

0

1Answer

標準 SQL では COMMIT などの予約語を識別子に使うことはできません。 PostgreSQL では制約が緩く、標準 SQL において予約語とされるキーワードの多くが予約語ではなくなっていて識別子に使えるようです。 COMMIT は識別子に使える非予約キーワード(non-reserved key word)とマークされています。

PostgreSQL がなぜこんな仕様なのかは分かりませんが、古いバージョンや他の SQL 実装との互換性のためではないかと思います。

3Like

Comments

  1. @vyx02237

    Questioner

    ありがとうございました。ご回答内のリンク参考になります。一発エラーでなくても、ワーニング等を表示する位あってもいいのではないかと思いました。(ログにも報告されていないようでした)

Your answer might help someone💌