使用 INSERT 语句插入行

要向表或视图添加单行或多行,请使用 INSERT 语句的格式。

您可以使用 INSERT 语句通过下列其中一种方法将新行添加到表或视图:

  • 在 INSERT 语句中指定要添加的列的值。
  • 在 INSERT 语句中包含 SELECT 语句,以告知 SQL 新行的哪些数据包含在另一个表或视图中。
  • 指定 INSERT 语句的分块格式以添加多行。

对于插入的每一行,如果该列没有缺省值,那么必须为使用 NOT NULL 属性定义的每一列提供一个值。 用于将行添加到表或视图的 INSERT 语句可能如下所示:

   INSERT INTO table-name
      (column1, column2, ... )
   VALUES (value-for-column1, value-for-column2, ... )

INTO 子句对您为其指定值的列进行命名。 VALUES 子句指定 INTO 子句中指定的每个列的值。 您指定的值可以是:

  • 常量。 插入 VALUES 子句中提供的值。
  • 空值。 使用关键字 NULL 插入空值。 必须将该列定义为能够包含空值或发生错误。
  • 主变量。 插入主变量的内容。
  • 全局变量。 插入全局变量的内容。
  • 专用寄存器。 插入专用寄存器值; 例如 USER。
  • 表达式。 插入表达式产生的值。
  • 标量全查询。 插入作为运行 SELECT 语句的结果的值。
  • DEFAULT 关键字。 插入列的缺省值。 必须为该列定义缺省值,或者允许 NULL 值,否则将发生错误。

必须在 VALUES 子句中为 INSERT 语句的列列表中指定的每个列提供值。 如果表中的所有列都具有 VALUES 子句中提供的值,那么可以省略列名列表。 如果列具有缺省值,那么可以将关键字 DEFAULT 用作 VALUES 子句中的值。 这将导致该列的缺省值放置在该列中。

最好对要插入值的所有列进行命名,因为:

  • INSERT 语句更具描述性。
  • 您可以验证是否根据列名以正确的顺序提供值。
  • 您具有更好的数据独立性。 在表中定义列的顺序不会影响 INSERT 语句。

如果将列定义为允许空值或具有缺省值,那么无需在列名列表中对其进行命名或为其指定值。 将使用缺省值。 如果将该列定义为具有缺省值,那么会将缺省值放在该列中。 如果在没有显式缺省值的情况下为列定义指定了 DEFAULT ,那么 SQL 会将该数据类型的缺省值放在列中。 如果该列没有为其定义缺省值,但定义为允许空值 (未在列定义中指定 NOT NULL) ,那么 SQL 会将空值放在该列中。

  • 对于数字列,缺省值为 0。
  • 对于固定长度字符或图形列,缺省值为空白。
  • 对于固定长度的二进制列,缺省值为十六进制零。
  • 对于可变长度字符,图形或二进制列以及对于 LOB 列,缺省值为零长度字符串。
  • 对于日期,时间和时间戳记列,缺省值为当前日期,时间或时间戳记。 插入记录块时,将在写入该块时从系统中抽取缺省日期/时间值。 这意味着将为该列分配块中每行的相同缺省值。
  • 开始更改对于布尔值列,缺省值为 FALSE。结束更改
  • 对于 DataLink 列,默认值与 DLVALUE('',' URL ','') 对应。
  • 对于单值类型列,缺省值是相应源类型的缺省值。
  • 对于 ROWID 列或定义为 AS IDENTITY 的列,数据库管理器会生成缺省值。
  • 对于 XML 列,除了空值以外,不允许使用缺省值。

当程序尝试插入与表中已存在的另一行重复的行时,可能会发生错误。 根据创建索引时使用的选项,多个空值可能被视为重复值,也可能不被视为重复值。

  • 如果表具有主键,唯一键或唯一索引,那么不会插入该行。 相反, SQL 返回 SQLCODE -803。
  • 如果表没有主键,唯一键或唯一索引,那么可以插入行而不会发生错误。

如果 SQL 在运行 INSERT 语句时发现错误,那么它将停止插入数据。 如果指定 COMMIT (*ALL) , COMMIT (*CS) , COMMIT (*CHG) 或 COMMIT (*RR) ,那么不插入任何行。 将删除此语句已插入的行 (对于带有 SELECT 语句或分块插入的 INSERT)。 如果指定 COMMIT (*NONE) ,那么 不会 删除已插入的任何行。

SQL 创建的表是使用 "复用已删除的记录" 参数 *YES 创建的。 这允许数据库管理器复用表中标记为已删除的任何行。 可以使用 CHGPF 命令将属性更改为 *NO。 这将导致 INSERT 始终将行添加到表的末尾。

插入行的顺序不保证检索行的顺序。

如果插入该行时未发生错误,那么 SQLCA 的 SQLERRD (3) 字段的值为 1。

注: 对于分块的 INSERT 或带有 SELECT 语句的 INSERT ,可以插入多行。 插入的行数反映在 SQLCA 中的 SQLERRD (3) 中。 它还可从 GET DIAGNOSTICS 语句中的 ROW_COUNT 诊断项获取。