当您从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;
^