插入

、概述

插入stmt:

WITH RECURSIVE common-table-expression , REPLACE INSERT OR ROLLBACK INTO ABORT FAIL IGNORE REPLACE schema-name . table-name AS alias ( column-name ) , VALUES ( expr ) , , upsert-clause select-stmt upsert-clause DEFAULT VALUES returning-clause

公用表表达式:

表达式:

返回子句:

选择stmt:

更新子句:

INSERT 语句有三种基本形式。

  1. INSERT INTO table VALUES(...);

    第一种形式(使用“VALUES”关键字)在现有表中创建一个或多个新行。如果省略表名后的列名列表, 则每行插入的值数必须与表中的列数相同。在这种情况下,从 VALUES 列表的每个项计算最左边的表达式的结果被插入到每个新行的最左边的列中,对于每个后续表达式等等。如果列名 指定列表,则 VALUE 列表的每个项中的值数必须与指定列数匹配。新行的每个命名列都填充了计算相应 VALUES 表达式的结果。未出现在列列表中的表列将填充 默认列值(指定为CREATE TABLE语句的一部分),如果未指定默认值,则填充 NULL 。

  2. INSERT INTO table SELECT ...;

    INSERT 语句的第二种形式包含SELECT语句而不是 VALUES 子句。对于通过执行 SELECT 语句返回的每一行数据,都会将一个新条目插入到表中。如果指定了列列表,则 SELECT 结果中的列数必须与列列表中的项目数相同。否则,如果未指定列列表,则 SELECT 结果中的列数必须与表中的列数相同。任何 SELECT 语句,包括 复合 SELECT和带有ORDER BY和/或LIMIT子句的 SELECT 语句,都可以用在这种形式的 INSERT 语句中。

    为避免解析歧义,SELECT 语句应始终包含 WHERE 子句,即使该子句只是“WHERE true”(如果存在upsert 子句)。如果没有 WHERE 子句,解析器就不知道标记“ON”是 SELECT 上的连接约束的一部分,还是upsert-clause的开头。

  3. INSERT INTO table DEFAULT VALUES;

    INSERT 语句的第三种形式是使用 DEFAULT VALUES。INSERT ... DEFAULT VALUES 语句将一个新行插入到指定表中。新行的每一列都填充有其 默认值,如果在CREATE TABLE语句中没有将默认值指定为列定义的一部分,则填充 NULL 。DEFAULT VALUES 后不支持 upsert 子句

初始的“INSERT”关键字可以替换为“REPLACE”或“INSERT OR action ”,以指定在该 INSERT 命令期间使用的替代约束冲突解决算法。为了与 MySQL 兼容,解析器允许使用单个关键字REPLACE作为“INSERT OR REPLACE”的别名。

仅顶级 INSERT 语句支持表名上的可选“ schema-name . ”前缀 。对于CREATE TRIGGER语句中出现的 INSERT 语句,表名必须是非限定的同样,仅顶层 INSERT 语句支持 INSERT 语句的“DEFAULT VALUES”形式,而不支持触发器中的 INSERT 语句。

可选的“AS alias ”短语为插入内容的表提供了一个替代名称。别名可以在UPSERT的 WHERE 和 SET 子句中使用。如果没有 upsert-clause,那么别名就没有意义,但也无害。

如果 INSERT 违反唯一性约束,请参阅单独的UPSERT文档以了解可能导致 INSERT 表现为 UPDATE 的附加尾随语法。INSERT ... DEFAULT VALUES”不允许使用 upsert 子句。