INSERT

Name

INSERT -- 在表中创建新行

Synopsis

INSERT INTO table [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) | query }

描述

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

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

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

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

要想向表中插入数据,你必须有 INSERT 权限, 如果你使用了 query 子句插入来自查询里的数据行, 你还需要拥有在查询里使用的表的 SELECT 权限。

参数

table

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

column

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

DEFAULT VALUES

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

expression

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

DEFAULT

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

query

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

输出

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

INSERT oid count

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

例子

向表 films 里插入一行:

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

在这个个例子里面省略了字段 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 minute');
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');

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

INSERT INTO films DEFAULT VALUES;

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

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

插入数组:

-- 创建一个空的 3x3 游戏板来玩圈-和-叉游戏
-- (这些查询创建相同的板属性)
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1,'{{"","",""},{"","",""},{"","",""}}');
INSERT INTO tictactoe (game, board[3][3])
    VALUES (2,'{}');
    VALUES (2,'{{,,},{,,},{,,}}');

兼容性

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

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