通过视图插入行
您可通过 single-table 视图插入数据,如果您有对该视图的 Insert 权限。 要执行此操作,可仅从一表定义 SELECT 语句,且它不包含下列任何组件:
- DISTINCT 关键字
- GROUP BY 子句
- 派生的值(也称之为虚拟列)
- 聚集值
如果未指定缺省值,则在视图中未定义的底层表中的列收到缺省值或 NULL 值。如果这些列之一没有缺省值,且不允许 NULL 值,则 INSERT 失败。
您可使用数据完整性约束来防止用户将值插入到不符合视图定义 SELECT 语句的底层表内。要获取进一步的信息,请参阅 WITH CHECK OPTION 关键字。
如果 INSTEAD OF 触发器在其 Action 子句中指定有效的 INSERT 操作,则您可通过 single-table 或 multiple-table 视图插入行。要获得关于如何创建通过视图插入的 INSTEAD OF 触发器的信息,请参阅 视图上的 INSTEAD OF 触发器。
如果几个用户正在将敏感信息输入到单个表内,则内建的 USER 函数可限制他们的视图每一用户仅插入指定的行。下列示例包含视图和实现此效果的 INSERT 语句:
CREATE VIEW salary_view AS
SELECT lname, fname, current_salary FROM salary WHERE entered_by = USER;
INSERT INTO salary VALUES ('Smith', 'Pat', 75000, USER);
使用游标插入行
在 GBase 8s ESQL/C 中,如果您将游标与 INSERT 关联,则必须使用 OPEN、PUT 和 CLOSE 语句来执行 INSERT 操作,对于有事务但不符合 ANSI 的数据库,您必须在一个事务内发出这些语句。
如果您正在使用与 INSERT 语句关联的游标,则在您将行写入磁盘之前缓冲它们。在下列条件下,刷新插入缓冲区:
- 缓冲区已满。
- 执行 FLUSH 语句。
- CLOSE 语句关闭该游标。
- 在不符合 ANSI 的数据库中,OPEN 语句隐式地关闭游标,然后重新打开它。
- COMMIT WORK 语句终结该事务。
当刷新插入缓冲区时,在将这些行发送到数据库服务器之前,客户端处理器执行适当的数据转换。当数据库服务器收到该缓冲区时,它转换任何用户定义的数据类型,然后开始将这些行插入一次到数据库内。如果在数据库服务器将缓冲的行插入到数据库内期间遇到错误,则在最后一次成功地插入了的行之后的任何缓冲的行都被废弃。
将行插入到不带有事务的数据库内
如果您正在无事务日志记录地将行插入到数据库内,则一旦操作失败,您必须采取显式操作来恢复插入的行。例如,如果在插入一些行之后 INSERT 失败,则那些成功地插入了的行保留在表中。您不可自动地从失败的数据库插入恢复,因为不存在事务日志。
将行插入到带有事务的数据库内
如果您正在将行插入到数据库内,且正在使用显式的事务,在使用 ROLLBACK WORK 语句来撤销 INSERT。如果您在 INSERT 之前未执行 BEGIN WORK,且 INSERT 失败,则数据库服务器自动地回滚从 INSERT 开始以来产生的任何数据修改。如果您正在使用显式的事务,且 INSERT 失败,则数据库服务器自动地撤销 INSERT 的影响。
在符合 ANSI 的数据库中,事务是隐式的,且所有数据库更改都发生在一个事务之内。在此情况下,如果 INSERT 语句失败,则使用 ROLLBACK WORK 语句来撤销这些插入。
您以 RAW 日志记录类型创建的表无日志记录。这样,即使数据库使用日志记录,原始表也是不可恢复的。
您以事务插入的那些行保持锁定,直到该事务结束为止。事务的结束,或是通过 COMMIT WORK 语句对数据库做出所有修改,或是通过 ROLLBACK WORK 语句对数据库不做任何修改。如果单个 INSERT 语句影响许多行,则您可超过允许的并发锁的最大数目。要防止出现此情况,或者每个事务少插入些行,或者在您执行 INSERT 语句之前锁定页面(或整个表)。
VALUES 子句
VALUES 子句可指定要插入到一列或多列内的值。当您使用 VALUES 子句时,您可一次仅插入一行。
跟在 VALUES 关键字之后的每一值都指定给罗列在 INSERT INTO 子句中的对应列(或如果未指定列的列表,则以列的顺序罗列)。 如果您正在将引用的字符串插入到列内,则可无差错地插入的最大长度是 256 字节。
VALUES 子句
元素 | 描述 | 限制 | 语法 |
indicator_var | 如果 SQL 语句返回 NULL 给 input_var,则要显示的变量 | 请参阅 GBase 8s ESQL/C 程序员手册。 | 特定于语言 |
input_var | 持有要插入的值的变量。此可为集合变量。 | 可包含任何 VALUES 子句的值选项 | 特定于语言 |
literal_opaque | 不透明数据类型的文字表示 | 必须被不透明数据类型的 input 支持函数识别 | 请参阅不透明类型的文档。 |
literal_Boolean | 作为单个字符的 BOOLEAN 值的文字表示 | 或是 't' (TRUE) 或是 'f' (FALSE) | 引用字符串 |
在 GBase 8s ESQL/C 中,如果您使用 input_var 变量来指定该值,则可向表内插入长于 256 字节的字符串。
要了解在 VALUES 子句中有效的关键字和精确值的类型,请参考 常量表达式。
考虑数据类型
INSERT 语句放入到列内的值无需与接收它的列具有相同的数据类型。然而,这两种数据类型必须兼容。如果数据库服务器有方法将一种数据类型强制转型为另一种,则两种数据类型是兼容的。强制转型是数据库服务器将一种数据类型转换为另一种的机制。
数据库服务器尽其所能地执行数据转换。如果数据不可转换,则 INSERT 操作失败。如果目标数据类型不可持有指定的值,则数据转换也失败。例如,您不可将整数 123456 插入到定义为 SMALLINT 数据类型的列内,因为此数据类型不能持有那么大的数。
对于数据库服务器提供的强制转型的总结,请参阅 GBase 8s SQL 参考指南。要了解关于如何创建用户定义的强制转型的信息,请参阅本文档中的 CREATE CAST 语句以及 GBase 8s 用户定义的例程和数据类型开发者指南 。
在使用非缺省语言环境的数据库中,如果 GL_DATETIME 环境变量有非缺省的设置,则在 INSERT 语句可正确地将本地化的 DATETIME 值插入到数据库表内,或视图内,或 EXTERNAL 表对象内之前,必须将 USE_DTENV 环境变量设置为 1。