我发出以下 DDL:
CREATE TABLE foo
(
loopa INTEGER,
loop INTEGER
);
然后,检查服务器中的 DDL(使用像DbVisualizer这样的客户端工具- 抱歉不知道直接生成它的查询)我看到以下内容:
CREATE TABLE
foo
(
loopa INTEGER,
LOOP INTEGER
);
观察 named 列大小写的变化,而 named 列loop
则没有loopa
。查看SQL关键字 loop
列表似乎没有关键字。那么,为什么会有这种选择性的改变呢?
这似乎与我在尝试访问loop
表中的列时遇到的问题有关:
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: record "new" has no field "loop"
(无论触发器函数中的代码是否以NEW.LOOP
或访问字段,我都会得到相同的错误NEW.loop
)
更新
大写字母似乎是 DbVisualizer 的产物。psql
显示:
psql (9.1.13)
Type "help" for help.
foo-test=> \dS+ foo
Table "test.foo"
Column | Type | Modifiers | Storage | Description
--------+---------+-----------+---------+-------------
loopa | integer | | plain |
loop | integer | | plain |
Has OIDs: no
然而,这仍然不能解释为什么 PostgreSQL 引擎显然不允许我的触发器访问NEW.loop
. 当我将列(和触发代码)重命名为loopi
一切似乎工作正常。因此,除了 DbVisualizer 故障之外,这里可能还有更深层次的原因在起作用。稍后我将尝试创建一个 SSCCE。
更新 2
触发问题的 SSCCE 已在此处创建。
LOOP 一词是 PL/pgSQL 中的保留字。如果要将其用作列名,则需要将其引用。