INSERT

Name

INSERT -- 在表中创建新行

Synopsis

INSERT INTO table [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

描述

INSERT向表中插入新行。可以一次插入用值表达式声明的一行或者 一个查询结果表现出来的零行或多个行。

目标列表中的列/字段可以按任何顺序排列。如果完全没有列出任何字段名,那么缺省是全部字段, 顺序是按照表声明的时候的顺序;如果VALUES子句或者query 里面只提供了N个字段,那么就是头N个字段。 VALUES子句或者query提供的数值是以从左到右的方式与明确 或者隐含的字段列表关联的。

每个没有在明确或者隐含的字段列表中出现的字段都将填充缺省值,如果有声明的缺省值则用 声明的那个,如果没有则用 NULL 。

如果每行的表达式不是正确的数据类型,系统将试图进行自动的类型转换。

可选的RETURNING子句将导致INSERT返回实际插入的行,它主要用于 获取缺省的计算值(比如序列值),不过,任何使用该表字段的表达式都是允许的。 RETURNING列表的语法都与SELECT的输出列表相同。

为了对表执行插入操作您必须对该表有INSERT权限。若一个 列列表被执行,您只需要对列出的列有INSERT权限。使用 RETURNING子句需要在RETURNING中提到的所有列上有 SELECT权限。如果您使用query 子句来从一个查询中插入行,您当然需要对查询中用到的任意表或者列有 SELECT权限。

参数

table

现存表的名称(可以有模式修饰)

column

table中的字段名。必要时, 字段名可以有子字段名或者数组下标修饰。向一个复合类型中的某些字段插入数据的话, 其它字段将是 NULL 。

DEFAULT VALUES

所有字段都会用它们的缺省值填充

expression

赋予对应的column的一个有效表达式或值

DEFAULT

对应的column将被它的缺省值填充

query

一个查询(SELECT语句),它提供插入的数据行。请参考 SELECT语句获取语法描述。

output_expression

INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 该表达式可以使用table的任意字段。 可以使用*返回被插入行的所有字段。

output_name

一个字段的输出名称

Outputs

成功完成后,一条INSERT命令返回一个下面形式的命令标签

INSERT oid count

count是插入的行数。如果 count正好是一,并且目标表有 OID,那么oid 是赋予插入行的OID。否则oid 是零。

如果INSERT命令包含RETURNING子句,其结果将和一个 SELECT语句相同,包含那些基于该命令实际插入的行计算的、定义在 RETURNING列表中的字段的值。

示例

向表films里插入单独一行:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes');

在这个例子里面省略了字段len,因此在它里面将存储缺省值:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

在这个例子里,用DEFAULT子句作为日期字段,而不是声明一个数值:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes');
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');

插入一行完全由缺省值组成的数据行:

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');

从表tmp_films中插入几行到表films中, 字段布局与films相同:

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';

插入数组:

-- Create an empty 3x3 gameboard for noughts-and-crosses
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- The subscripts in the above example aren't really needed
INSERT INTO tictactoe (game, board)
    VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');

distributors表插入一个单独的行,并返回由 DEFAULT子句生成的序列值:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

兼容性

INSERT语句与 SQL 标准兼容。但RETURNING子句是 PostgreSQL扩展。同样,省略字段名列表,但是并非所 有字段都从VALUES子句或者query填充的这种用法是标 准不允许的。

可能碰到的关于query子句特性的限制在 SELECT语句中有相关文档。