问题描述
“to”关键字在 sql,特别是 POSTGREsql 中有什么作用。
我可以验证它是一个关键字。
然而,搜索诸如“to”之类的简单词是非常困难的。
它不会出现在这里,例如: https://www.w3schools.com/SQl/sql_ref_keywords.asp
我不知道这是特定于 POSTGREsql 还是更一般的......
解决方法
搜索解析器 src/backend/parser/gram.y
为 TO
,你会发现:
-
SET name TO 'var_value'
-
INTERVAL HOUR TO MINUTE
(数据类型) -
ALTER TABLE <name> OWNER TO RoleSpec
-
FOR VALUES FROM '(' expr_list ')' TO '(' expr_list ')'
(分区) -
COPY ( query ) TO file [WITH] [(options)]
-
ALTER EXTENSION name UPDATE [ TO version ]
-
IMPORT FOREIGN SCHEMA remote_schema [ { LIMIT TO | EXCEPT } ( table_list ) ]
-
CREATE POLICY name ON table [AS { PERMISSIVE | RESTRICTIVE } ] [FOR { SELECT | INSERT | UPDATE | DELETE } ] [TO role,...] [USING (qual)] [WITH CHECK (with check qual)]
-
ALTER TYPE_P any_name RENAME VALUE_P Sconst TO Sconst
-
REASSIGN OWNED BY role_list TO RoleSpec
-
GRANT privileges ON privilege_target TO grantee_list
-
CREATE opt_or_replace TRANSFORM FOR Typename LANGUAGE name (TO SQL_P WITH FUNCTION function_with_argtypes)
-
ALTER THING name RENAME TO newname
-
CREATE opt_or_replace RULE name AS ON event TO qualified_name where_clause DO opt_instead RuleActionList
-
ROLLBACK opt_transaction TO SAVEPOINT ColId
-
CREATE [DEFAULT] CONVERSION <conversion_name> FOR <encoding_name> TO <encoding_name> FROM <func_name>
-
a_expr SIMILAR TO a_expr
关键字不“做”任何事情,它们只是被保留,以便在实现 SQL 解析器时您可以假设如何处理查询的某些部分。
在技术术语中,任何 TO
实例(它是 ISO 9075 SQL standard 的一部分并被所有主要 SQL 方言使用)都被视为令牌,除非另有转义。
它“做什么”完全取决于上下文。在某些情况下,它只是装饰性的,而在其他情况下,它是语法的必需部分。它只是用来表达特定的语句。
为什么?这就是定义语法的方式。
请记住,SQL 被设计为一种类似英语的查询语言,因此某些语句的措辞反映了这一点。 INSERT INTO
可以表示为 INS
并且它的操作方式相同,但这不是设计者想要的样子。
TO
关键字与 SET
一起设置运行时参数时使用,例如 SET search_path TO my_schema,public;
您可以在https://www.postgresql.org/docs/13/sql-set.html
中看到它的描述由于它不是“正常”SELECT
、UPDATE
、CREATE
语法的一部分,因此您可以理解为什么它不经常出现。
编辑:作为评论者在下面非常有帮助地指出,它被用在几个地方,包括 grant 和 alter 语句等。它有时起到等号的作用(例如在设置参数时) ) 有时扮演识别受影响的人或事物的角色(例如授予),有时根据特定语句表达操作的最终结果(回滚到、更改表到)。就像英语中的“to”一样,它在很大程度上取决于上下文。