将值插入到串行列之内
您可插入连续的数字、显式值或重置在 SERIAL、BIGSERIAL 或 SERIAL8 列中值的显式值:
- 要插入连续的串行值
为 INSERT 语句中的串行列指定零(0)。在此情况下,数据库服务器指定下一最高值。
- 要插入显式值
首先验证在表中没有重复的非零值,之后指定非零值。如果该串行列单独地索引,或有唯一约束,且表中已有重复的值,则导致错误。如果该值大于当前的最大值,您会在序列中创建间隔。
- 要创建序列中的间隔(即,重置串行值)
在列中指定大于当前最大值的正值。
另外,您可使用 ALTER TABLE 语句的 MODIFY 子句来重置串行列的下一值。
要了解更多信息,请参阅 更改下一个顺序值。
在串行列中 NULL 值无效。
在 GBase 8s 中,将序列值插入到作为表层级中一部分的表内,以您插入的值更新包含该串行计数器的层级中的所有表。您可将此值表示为零(0)作为下一最高值,或表示为特定的正整数。
将值插入到 Opaque 类型列内
GBase 8s 支持在 VALUES 子句中指定 opaque 数据类型的文字值作为引用的字符串的 INSERT 操作。您可使用此语法来将 opaque 的 UDT 插入到本地数据库的表的列内,或到本地实例的其他数据库中的表的列内。
当插入某些 opaque 数据类型时,需要特殊处理。例如,如果 opaque 数据类型包含占据空间的数据或多重表示的数据,则它可能提供如何存储该数据的选择:在内部结构中,或对于大对象,在智能大对象中。
这是通过调用名为 assign( ) 的用户定义的支持函数来完成的。当您在其行包含这些 opaque 类型之一的表上执行 INSERT 时,数据库服务器自动地为该类型调用 assign( ) 函数。assign( ) 函数可决定如何存储该数据。要了解更多关于 assign( ) 支持函数的信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指南 。
将值插入到集合列内
您可使用 VALUES 子句来将值插入到集合列内。要获取更多信息,请参阅 集合构造函数。
例如,假设您定义 tab1 表如下:
CREATE TABLE tab1
(
int1 INTEGER,
list1 LIST(ROW(a INTEGER, b CHAR(5)) NOT NULL),
dec1 DECIMAL(5,2)
);
下列 INSERT 语句将行插入到 tab1内:
INSERT INTO tab1 VALUES
(
10,
LIST{ROW(1,'abcde'),
ROW(POW(3,3), '=27'),
ROW(ROUND(ROOT(126)), '=11')},
100
);
在本示例中,集合列 list1 有三个元素。每一元素为带有一 INTEGER 字段和一 CHAR(5) 字段的未命名的行类型。第一个元素由两个精确值组成,一个整数(1)和一个引用的字符串(abcde)。第二个和第三个元素还使用引用的字符串来指出第二个字段,但以表达式指定第一个字段的值。
不管您使用什么方式来将值插入到集合列内,都不可将 NULL 元素插入到该列内。因而您使用的表达式不可等于 NULL。如果您尝试插入其中的集合包含 NULL 元素,则数据库服务器返回错误。
您还可使用集合变量来将一个或多个集合元素的值插入到集合列内。要获取更多信息,请参阅 集合派生表。
使用 VALUES 子句来将值插入到命名的或未命名的 ROW 类型列内,如下例所示:
CREATE ROW TYPE address_t
(
street CHAR(20),
city CHAR(15),
state CHAR(2),
zipcode CHAR(9)
);
CREATE TABLE employee
(
name ROW ( fname CHAR(20), lname CHAR(20)),
address address_t
);
下一示例在 name 和 address 列中插入精确值:
INSERT INTO employee VALUES
(
ROW('John', 'Williams'),
ROW('103 Baker St', 'Tracy','CA', 94060)::address_t
);
INSERT 使用 ROW 构造函数来生成 name 列(未命名的 ROW 数据类型)和 address 列(命名的 ROW 数据类型)的值。当您为命名的 ROW 数据类型指定值时,必须使用 CAST AS 关键字或双冒号(:: )运算符,以 ROW 数据类型的名称来将该值强制转型为命名的 ROW 数据类型。
要了解 ROW 构造函数的语法,请参阅“表达式”部分中的 构造函数表达式。要了解关于命名的 ROW 和未命名的 ROW 数据类型的精确值的信息,请参阅 Literal Row。
当您在 VALUES 子句中使用 ROW 变量时,该 ROW 变量必须包含每一字段值的值。要获取更多信息,请参阅 插入到行变量(ESQL/C、SPL)内。
您可使用 GBase 8s ESQL/C 主变量来以两种方式插入 nonliteral 值:
- 将整个 ROW 类型插入到列内。使用 VALUES 子句中的 row 变量来一次为 ROW 列中的所有字段插入值。
- ROW 类型的单个字段。要在 ROW 类型列中插入非精确值,请将这些元素插入到 row 变量内,然后在 UPDATE 语句的 SET 子句中指定该 collection 变量。
将值插入到 ROW 类型列内
使用 VALUES 子句来将值插入到命名的或未命名的 ROW 类型列内,如下例所示:
CREATE ROW TYPE address_t
(
street CHAR(20),
city CHAR(15),
state CHAR(2),
zipcode CHAR(9)
);
CREATE TABLE employee
(
name ROW ( fname CHAR(20), lname CHAR(20)),
address address_t
);
下一示例在 name 和 address 列中插入精确值:
INSERT INTO employee VALUES
(
ROW('John', 'Williams'),
ROW('103 Baker St', 'Tracy','CA', 94060)::address_t
);
INSERT 使用 ROW 构造函数来生成 name 列(未命名的 ROW 数据类型)和 address 列(命名的 ROW 数据类型)的值。当您为命名的 ROW 数据类型指定值时,必须使用 CAST AS 关键字或双冒号(:: )运算符,以 ROW 数据类型的名称来将该值强制转型为命名的 ROW 数据类型。
要了解 ROW 构造函数的语法,请参阅“表达式”部分中的 构造函数表达式。要了解关于命名的 ROW 和未命名的 ROW 数据类型的精确值的信息,请参阅 Literal Row。
当您在 VALUES 子句中使用 ROW 变量时,该 ROW 变量必须包含每一字段值的值。要获取更多信息,请参阅 插入到行变量(ESQL/C、SPL)内。
您可使用 GBase 8s ESQL/C 主变量来以两种方式插入 nonliteral 值:
- 将整个 ROW 类型插入到列内。使用 VALUES 子句中的 row 变量来一次为 ROW 列中的所有字段插入值。
- ROW 类型的单个字段。要在 ROW 类型列中插入非精确值,请将这些元素插入到 row 变量内,然后在 UPDATE 语句的 SET 子句中指定该 collection 变量。