关键字

当您从Oracle数据库迁移或使用Oracle语法开发应用时,可能会因误用关键字而导致SQL语法错误。为解决此问题,PolarDB PostgreSQL版(兼容Oracle)将关键字分为保留、列名和函数名三类,并为每类关键字定义了明确的使用规则。遵循这些规则,可以帮助您编写合规的SQL,确保代码的兼容性与规范性。

核心原则

为提供更灵活的SQL语法兼容性,PolarDB PostgreSQL版(兼容Oracle)支持三类关键字。了解它们的区别是避免语法错误的关键:

  • 保留关键字:属于系统保留字,不可直接用作表名、列名或函数名,除非通过双引号"进行转义引用。

  • 列名关键字:可用作列名或表名,但不能用作普通数据类型名或函数名。

  • 函数名关键字:允许用作函数名,但不可用作表名或列名。

合理区分和使用这些关键字,有助于避免语法冲突,提高SQL的兼容性和开发的规范性。

关键字速查表

保留关键字

ALL

ANALYSE

ANALYZE

AND

ANY

ARRAY

AS

ASC

ASYMMETRIC

BOTH

CASE

CHECK

COLLATE

COLUMN

CONNECT_BY_ROOT

CONSTRAINT

CREATE

CURRENT_CATALOG

CURRENT_ROLE

CURRENT_TIME

CURRENT_TIMESTAMP

CURRENT_USER

DEFAULT

DEFERRABLE

DESC

DISTINCT

DO

ELSE

END

EXCEPT

FALSE

FETCH

FOR

FOREIGN

FROM

GRANT

GROUP

HAVING

IN

INITIALLY

INTERSECT

INTO

LATERAL

LEADING

LEVEL

LIMIT

LOCALTIME

LOCALTIMESTAMP

LOOP

MINUS

NOT

NULL

OFFSET

ON

ONLY

OR

ORDER

PLACING

POLAR_SYS_ROWID_ATTR

PRIOR

REFERENCES

RETURNING

ROWNUM

SELECT

SESSION_USER

SOME

SYMMETRIC

TABLE

THEN

TO

TRAILING

TRUE

UNION

UNIQUE

USER

USING

VARIADIC

WHEN

WHERE

WINDOW

WITH

列名关键字

BETWEEN

BIGINT

BINARY_DOUBLE

BINARY_FLOAT

BINARY_INTEGER

BIT

BLOB

BOOLEAN

CHAR

CHARACTER

CLOB

COALESCE

DATETIME

DEC

DECIMAL

EXISTS

FLOAT

GREATEST

GROUPING

GROUPING_ID

GROUP_ID

INOUT

INT

INTEGER

INTERVAL

LEAST

LONG

LONGTEXT

MEDIUMTEXT

NATIONAL

NCHAR

NCLOB

NONE

NORMALIZE

NULLIF

NUMBER

NUMERIC

NVARCHAR

NVARCHAR2

OUT

OVERLAY

PLS_INTEGER

PRECISION

RAW

REAL

ROW

SETOF

SMALLINT

SUBSTRING

TIME

TIMESTAMP

TIMESTAMPLTZ

TREAT

TRIM

UROWID

VALUES

VARCHAR

VARCHAR2

XMLATTRIBUTES

XMLCONCAT

XMLELEMENT

XMLEXISTS

XMLFOREST

XMLNAMESPACES

XMLPARSE

XMLPI

XMLROOT

XMLSERIALIZE

XMLTABLE

函数名关键字

AUTHORIZATION

BINARY

COLLATION

CONCURRENTLY

CROSS

CURRENT_SCHEMA

FREEZE

FULL

ILIKE

INNER

IS

ISNULL

JOIN

LEFT

LIKE

NATURAL

NOTNULL

OVERLAPS

RIGHT

SIMILAR

TABLESAMPLE

VERBOSE

场景化示例:如何正确使用标识符

通过正反面对比,展示在不同场景下如何处理与关键字同名的标识符。

场景一:创建表时使用关键字作为列名

创建一个包含名为order列的表。

正确用法

使用双引号将关键字括起来,强制其作为标识符。

CREATE TABLE t_order (
    id INT PRIMARY KEY,
    "order" VARCHAR(50) -- 使用双引号进行转义
);

执行结果:

CREATE TABLE

错误用法

直接使用关键字作为列名,将导致语法错误。

CREATE TABLE t_order (
    id INT PRIMARY KEY,
    order VARCHAR(50) -- "order" 是保留关键字
);

执行结果:

ERROR:  syntax error at or near "order"
LINE 3:     order VARCHAR(50) 
            ^

场景二:查询包含关键字列的数据

查询t_order表中由双引号定义的order列。

正确用法

在查询时也需使用双引号。

-- 插入示例数据
INSERT INTO t_order (id, "order") VALUES (1, 'PolarDB');

-- 正确查询
SELECT id, "ORDER" FROM t_order;

执行结果:

 id |  ORDER  
----+---------
  1 | PolarDB
(1 row)

错误用法

在查询时不使用双引号,数据库会将其误解为关键字找不到列。

-- 错误示例: 缺少双引号
SELECT id, order FROM t_order;

执行结果:

ERROR:  syntax error at or near "order"
LINE 1: SELECT id, order FROM t_order;
                   ^