400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
工具指南
数据类型
存储引擎
执行引擎
流计算引擎
灾难恢复
系统配置参数
索引
扩展
SQL 参考
常见问题(FAQ)
在表中创建新行。
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table [( column [, ...] )]
{DEFAULT VALUES | VALUES ( {expression | DEFAULT} [, ...] ) [, ...] | query}
[ON CONFLICT [conflict_target] conflict_action]
[RETURNING * | output_expression [[AS] output_name] [, ...]]
其中 conflict_target 可以是以下之一:
( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
且 conflict_action 是以下之一:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
INSERT
将新行插入表中。可以插入由值表达式指定的一或多个行,或查询产生的零或多个行。
目标列名称可以按任何顺序列出。如果根本没有给出任何列名列表,则默认为表中的列按声明的顺序排列。VALUES
子句或查询提供的值与从左到右的显式或隐式列列表相关联。
在显式或隐式列列表中不存在的每个列都将填充一个默认值,该默认值可以是其声明的默认值,如果没有默认值,则为 NULL
。
如果任何列的表达式的数据类型都不正确,则将尝试自动类型转换。
YMatrix 支持 INSERT INTO ... VALUES ... ON CONFLICT ... DO ...
的语法来支持对 HEAP 表数据进行 UPSERT 操作。限制:使用 UPSERT 功能时,建表的唯一约束或索引必须包含分布键。同时,UPSERT 不支持在不同实例间移动数据,不支持更新分布键。更多 UPSERT 使用方法请见数据分批合并场景(UPSERT)。此语句只适用于 HEAP 表。
可选的 RETURNING
子句使 INSERT
根据实际插入的每一行计算并返回值。这对于获取默认提供的值(例如序列号)很有用。但是,允许使用表列的任何表达式。RETURNING
列表的语法与 SELECT
的输出列表的语法相同。
您必须对表具有 INSERT
特权才能插入表中。指定列列表后,仅需要对列出的列具有 INSERT
特权。使用 RETURNING
子句需要 RETURNING
中提到的所有列都具有 SELECT
特权。如果提供查询以插入查询中的行,则必须对查询中引用的任何表或列具有 SELECT
特权。
注意!
UPSERT 不是一个 SQL 语句,而是一个在时序场景中为便于数据分批上传而支持的更新 / 插入操作。
成功完成后,INSERT
命令将返回以下形式的命令标记:
INSERT oid count
count
是插入的行数。如果 count
恰好为 1
,并且目标表具有 OID
,则 OID
是分配给插入行的 OID
。否则,OID
为零。
插入
with_query
WITH
子句允许您指定一个或多个子查询,这些子查询可以在 INSERT
查询中按名称引用。WITH
子句的 INSERT
命令, 该子句只能包含 SELECT
语句, 而 WITH
子句不能包含数据修改命令(INSERT
,UPDATE
或 DELETE
)。SELECT
语句)也可能包含 WITH
子句。 在这种情况下,可以在 INSERT
查询中引用两套 with_query
, 但是第二套优先,因为它的嵌套更紧密。table
column
DEFAULT VALUES
expression
DEFAULT
query
SELECT
语句)。 有关语法的说明,请参见 SELECT
语句。output_expression
INSERT
命令计算并返回的表达式。 该表达式可以使用表的任何列名称。 写入 *
返回插入行的所有列。output_name
ON CONFLICT 子句
ON CONFLICT DO UPDATE 保证一个原子的 INSERT 或者 UPDATE 结果。在没有无关错误的前提下,这两种结果之一可以得到保证,即使在很高的并发度也能保证。这也可以被称作 UPSERT — “UPDATE 或 INSERT”。
conflict_target
conflict_action
注意所有行级BEFORE INSERT触发器的效果都会 反映在被排除值中,因为那些效果可能会 让该行避免被插入。
要将数据插入分区表中,请指定根分区表,即使用 CREATE TABLE
命令创建的表。 您还可以在 INSERT
命令中指定分区表的叶子表。 如果数据对于指定的叶子表无效,则返回错误。 不支持在 INSERT
命令中指定不是叶子表的子表。 不支持在分区表的任何子表上执行其他 DML 命令,例如 UPDATE
和 DELETE
。 这些命令必须在根分区表(使用 CREATE TABLE
命令创建的表)上执行。
在表 films
中插入一行:
INSERT INTO films VALUES ('UA502', 'Bananas', 105,
'1971-07-13', 'Comedy', '82 minutes');
在此示例中,省略了 length
列,因此它将具有默认值:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
本示例对 date_prod
列使用 DEFAULT
子句,而不是指定值:
INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT,
'Comedy', '82 minutes');
要插入完全由默认值组成的行:
INSERT INTO films DEFAULT VALUES;
要使用多行 VALUES
语法插入多行:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
本示例从表 films
中向表 films
中插入一些行,其列布局与 films
相同:
INSERT INTO films SELECT * FROM tmp_films WHERE date_prod <
'2004-05-07';
在表 distributors
中插入一行,返回由 DEFAULT
子句生成的序列号:
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
RETURNING did;
在 HEAP 表实现 UPSERT:
// 创建测试表
CREATE TABLE conditions (
tag_id text NOT NULL,
ts timestamptz not null,
location text ,
temperature double precision ,
humidity double precision
) DISTRIBUTED BY (tag_id);
// 创建唯一索引
CREATE UNIQUE INDEX ON conditions(tag_id,ts);
// 插入测试数据
INSERT INTO conditions(tag_id,ts,location) VALUES('tag1','2022-07-19 00:00:00','office') ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
INSERT INTO conditions(tag_id,ts,temperature) VALUES('tag1','2022-07-19 00:00:00',70.2) ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
INSERT INTO conditions(tag_id,ts,humidity) VALUES('tag1','2022-07-19 00:00:00',50.1) ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
// 查看测试数据
mydb=# SELECT * FROM conditions;
tag_id | ts | location | temperature | humidity
--------+------------------------+----------+-------------+----------
tag1 | 2022-07-19 00:00:00+08 | office | |
(1 row)
Time: 16.340 ms
INSERT
符合 SQL 标准。 标准不允许列名列表被省略,但不是所有的列都由 VALUES
子句或查询填充的情况。
SELECT
记录了 query 子句的可能限制。