Postgresql

為什麼在 PostgreSQL 中名稱“循環”的處理方式不同

  • September 16, 2014

我發出以下 DDL:

CREATE TABLE foo
(
loopa INTEGER,
loop  INTEGER
);

然後,檢查伺服器中的 DDL(使用像DbVisualizer這樣的客戶端工具- 抱歉不知道直接生成它的查詢)我看到以下內容:

CREATE TABLE
   foo
   (
       loopa INTEGER,
       LOOP INTEGER
   );

觀察命名列的大小寫變化,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 中的保留字。如果要將其用作列名,則需要將其引用。

引用自:https://dba.stackexchange.com/questions/76764