【问题标题】:Postgres table column name restrictions?Postgres 表列名限制?
【发布时间】:2012-06-09 02:53:05
【问题描述】:

我在 psql 中做了这个:

CREATE TABLE IF NOT EXISTS apiss (skey TEXT, time INTEGER, user TEXT, ip TEXT);

我明白了

ERROR:  syntax error at or near "user" LINE 1: ...BLE IF NOT EXISTS apiss (skey TEXT, time INTEGER, user TEXT,...

我愿意:

CREATE TABLE IF NOT EXISTS apiss (skey TEXT, time INTEGER, userd TEXT, ip TEXT);

它有效。
注意 userd 而不是 user。

表的列名是否有一些限制? (postgresql v9.1.3)

【问题讨论】:

    标签: postgresql create-table


    【解决方案1】:

    这是一个很好的 PostgreSQL 保留字表:
    http://www.postgresql.org/docs/current/static/sql-keywords-appendix.html

    最好避免将这些词用作表名或列名。
    但是,另一种方法是将标识符括在双引号中,例如:

    CREATE TABLE IF NOT EXISTS apiss (
        skey TEXT, 
        time INTEGER, 
        "user" TEXT, 
        ip TEXT);
    

    此外,Postgres 保留系统列名供每个表内部使用: “每张表都有若干系统列,这些列是系统隐式定义的,因此这些名称不能作为用户自定义列的名称。”

    https://www.postgresql.org/docs/current/ddl-system-columns.html

    【讨论】:

    • 套用尤达的话,“如果你使用引用的标识符,它们将永远主宰你的命运。”带引号的标识符使用起来很痛苦,尤其是与不带引号的标识符混合使用。正如 OP 所说,最好完全避免它们。
    【解决方案2】:

    在我的公司,我必须扫描整个数据库以查找保留字。我在

    的帮助下解决了这个任务
    select * from pg_get_keywords()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2019-08-31
      相关资源
      最近更新 更多