【问题标题】:Why do postgres foreign keys have to be the last column in the table?为什么 postgres 外键必须是表中的最后一列?
【发布时间】:2021-05-13 14:38:59
【问题描述】:

这行得通:

CREATE TABLE scans 
(
    id BIGSERIAL NOT NULL PRIMARY KEY,
    ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
    started TIMESTAMP WITH TIME ZONE,
    finished TIMESTAMP WITH TIME ZONE,
    target_id INTEGER NOT NULL  
        REFERENCES targets ON UPDATE CASCADE
);

但是这个:

CREATE TABLE scans 
(
    id BIGSERIAL NOT NULL PRIMARY KEY,
    ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
    started TIMESTAMP WITH TIME ZONE,
    target_id INTEGER NOT NULL 
        REFERENCES targets ON UPDATE CASCADE,
    finished TIMESTAMP WITH TIME ZONE
);

因错误而失败:

错误:在“TIMESTAMP”或附近出现语法错误
第 6 行:使用时区设置完成的时间戳

如果我进一步更改行,错误总是在外键下方行的列类型上。将外键设置为最后一列可以解决此问题。

这是为什么?

【问题讨论】:

  • 你的第一个例子不起作用,finished TIMESTAMP WITH TIME ZONE 之后没有','。您显示的错误是针对您未显示的某些代码,请注意SET。请编辑您的问题以进行修复。仅供参考,FK 不必是最后一个字段。
  • 必须是别的东西,该语法确实有效:dbfiddle.uk/…
  • 哦,为什么错误消息中的finished 之前有一个SET?这不是任何一个陈述。
  • 完全题外话:当有开始时间戳和结束时间戳时,我会开始考虑时间戳范围。 tstzrange 在你的情况下。 postgresql.org/docs/current/rangetypes.html

标签: postgresql create-table


【解决方案1】:

感谢大家观看本文。

问题是从 Microsoft Code 中打开的文件中复制 SQL 并将其粘贴到 psql 会导致添加单词“SET”。

CREATE TABLE scans (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
    started TIMESTAMP WITH TIME ZONE,
    target_id INTEGER NOT NULL REFERENCES nmap_targets ON UPDATE CASCADE,
    finished TIMESTAMP WITH TIME ZONE
);

粘贴后变为:

spider=# CREATE TABLE scans (
spider(# id BIGSERIAL NOT NULL PRIMARY KEY,
spider(# ts TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
spider(# started TIMESTAMP WITH TIME ZONE,
spider(# target_id INTEGER NOT NULL REFERENCES nmap_targets ON UPDATE CASCADE,
spider(# SET finished TIMESTAMP WITH TIME ZONE
spider(# );
ERROR:  syntax error at or near "TIMESTAMP"
LINE 6: SET finished TIMESTAMP WITH TIME ZONE
                     ^

它将选项卡解释为自动完成。

通常没有什么要自动完成的,但是当它刚刚看到“... UPDATE CASCADE”时,它认为接下来会出现“SET”。

【讨论】:

  • 我也遇到过这个问题,很难弄清楚。
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多