Small. Fast. Reliable.
Choose any three.

1.概述

insert-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

common-table-expression:

expr:

返回条款:

select-stmt:

附加条款:

INSERT语句有三种基本形式。

  1. 插入VALUES(...);

    第一种形式(带有“ VALUES”关键字)在现有表中创建一个或多个新行。如果省略了table-name之后的column-name列表, 则插入到每一行中的值的数量必须与表中的列数相同。在这种情况下,将VALUES列表的每个术语的最左边表达式的求值结果插入到每个新行的最左边的列中,对于每个后续表达式,依此类推。如果列名 如果指定了list,则VALUE列表的每一项中的值数必须与指定列的数匹配。新行的每个命名列均填充有评估相应VALUES表达式的结果。未出现在列列表中的表列将填充默认列值(指定为CREATE TABLE语句的一部分),如果未指定默认值,则填充 NULL 。

  2. INSERT INTOSELECT ...;

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

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

  3. INSERT INTO默认值;

    INSERT语句的第三种形式是带有DEFAULT VALUES。INSERT ... DEFAULT VALUES语句将单个新行插入到命名表中。新行的每一列均填充有其默认值,如果CREATE TABLE语句中未将默认值指定为列定义的一部分,则填充 NULL 。该UPSERT子句DEFAULT值之后不被支持。

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

表名上的可选“ schema-name ”前缀 仅受顶级INSERT语句支持。对于在CREATE TRIGGER语句中出现的INSERT语句,表名必须是不合格的。类似地,仅顶级INSERT语句支持INSERT语句的“ DEFAULT VALUES”形式,触发器中不支持INSERT语句。

可选的“ AS别名”短语为插入内容的表提供了备用名称。别名可以在UPSERT的WHERE和SET子句中使用。如果没有 upsert子句,则别名是没有意义的,而且也是无害的。

如果INSERT否则会违反唯一性约束,则可能导致INSERT充当UPDATE的其他尾随语法,请参阅单独的UPSERT文档。该UPSERT条款不允许在一个“INSERT ...默认值”。