【发布时间】: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