1. 概述
insert-stmt
common-table-expression
expr
filter-clause
function-arguments
ordering-term
literal-value
over-clause
frame-spec
ordering-term
raise-function
type-name
signed-number
returning-clause
select-stmt
compound-operator
join-clause
join-constraint
join-operator
ordering-term
result-column
table-or-subquery
window-defn
frame-spec
upsert-clause
column-name-list
indexed-column
INSERT 语句有三种基本形式。
INSERT INTO table VALUES(...);
第一种形式(包含 "VALUES" 关键字)在现有表中创建一行或多行新数据。如果省略了 table-name 后面的 column-name 列表,则插入到每行中的值数量必须与表中的列数量相同。在这种情况下,将从 VALUES 列表中每个项的左侧表达式求值的结果插入到每行新数据的左侧列中,依此类推,对每个后续表达式也是如此。如果指定了 column-name 列表,则 VALUE 列表中每个项中的值数量必须与指定列的数量匹配。每行新数据的每个命名列都将使用与 VALUES 表达式相对应的求值结果填充。表中未出现在列列表中的列将使用 默认列值(在 CREATE TABLE 语句中指定)填充,或者在未指定 默认值 时使用 NULL 填充。
INSERT INTO table SELECT ...;
INSERT 语句的第二种形式包含一个 SELECT 语句,而不是一个 VALUES 子句。对于执行 SELECT 语句返回的每一行数据,都会在表中插入一条新记录。如果指定了列列表,则 SELECT 结果中的列数必须与列列表中的项数相同。否则,如果未指定列列表,则 SELECT 结果中的列数必须与表中的列数相同。任何 SELECT 语句(包括 复合 SELECT 以及包含 ORDER BY 和/或 LIMIT 子句的 SELECT 语句)都可以在这种形式的 INSERT 语句中使用。
为了避免解析歧义,即使 SELECT 语句只是 "WHERE true",也应该始终包含 WHERE 子句,如果存在 upsert-clause。如果没有 WHERE 子句,解析器就无法确定 "ON" 标记是 SELECT 中连接约束的一部分,还是 upsert-clause 的开头。
INSERT INTO table DEFAULT VALUES;
INSERT 语句的第三种形式是使用 DEFAULT VALUES。INSERT ... DEFAULT VALUES 语句将一行新数据插入到指定表中。新数据的每一列都将使用其 默认值 填充,或者在 CREATE TABLE 语句中的列定义中未指定默认值时使用 NULL 填充。DEFAULT VALUES 之后不支持 upsert-clause。
初始的 "INSERT" 关键字可以替换为 "REPLACE" 或 "INSERT OR action",以指定在该 INSERT 命令期间要使用的备用约束 冲突解决算法。为了与 MySQL 兼容,解析器允许使用单个关键字 REPLACE 作为 "INSERT OR REPLACE" 的别名。
table-name 上可选的 "schema-name." 前缀仅支持顶级 INSERT 语句。对于在 CREATE TRIGGER 语句中出现的 INSERT 语句,表名必须是未限定的。同样,INSERT 语句的 "DEFAULT VALUES" 形式仅支持顶级 INSERT 语句,而不支持触发器中的 INSERT 语句。
可选的 "AS alias" 短语为正在插入内容的表提供了替代名称。别名可以在 WHERE 和 SET 子句中使用 UPSERT。如果没有 upsert-clause,则 alias 是毫无意义的,但也无害。
请参阅单独的 UPSERT 文档,了解可能导致 INSERT 在 INSERT 否则会违反唯一性约束的情况下表现为 UPDATE 的附加尾随语法。在 "INSERT ... DEFAULT VALUES" 中不允许使用 upsert 子句。
此页面最后修改时间为 2022-01-08 05:02:57 UTC