插入语句
语句的形式如下:
INSERT [OR UPDATE] INTO table [(fields-list)] insert-data
fields-list::= field {, field }
field::= identifier { . identifier }
insert-data::= VALUES expressions-list | select-statement | record-data
expressions-list::= ( expression { , expression } )
SQL 的 INSERT 语句会在指定的表中创建一行新记录,其中的值由插入数据(可以是值列表、SELECT 语句的结果或包含要插入数据的 C 结构)指定。如果省略字段列表,则应用程序必须在表达式列表中为表中的每个字段提供一个值,且顺序必须与数据库模式中定义字段的顺序相同。
例如,根据上述表定义,以下语句是等价的:
INSERT INTO t VALUES (1, 2, 3, 4, 5)
INSERT INTO t (A, B, C, D, E) VALUES (1, 2, 3, 4, 5)
如果提供了字段列表,则字段列表中未指定的字段将采用数据库模式中指定的默认值,或者该字段类型的系统定义默认值(例如零或空字符串)。
在未指定字段列表的情况下,用作表达式列表替代的 SQL SELECT 语句的结果集必须返回与表中完全相同的字段数量;如果提供了字段列表,则必须返回与该字段列表中指定的字段数量相同。
例如,
INSERT INTO t SELECT V, W, X, Y, Z from t2
Or
INSERT INTO t (A, C, E) SELECT V, X, Z from t2
SmartESQL 特定的“记录数据”形式的 INSERT 语句允许应用程序不提供“字段列表”,而是指定一个包含要插入的字段值的 C 结构的地址。该 C 结构必须与数据库模式中定义的表完全对应。
例如,以下方法调用使用结构体 person 中提供的数据在表 Person 中创建新行:
engine.executeStatement( “INSERT INTO Person %r”, &person );
插入或更新
插入或更新语句首先会在值子句中指定的唯一键值下查找对象。如果找到该对象,则会对其进行更新;如果未找到,则会创建一个新对象。请注意,语句中的前一列(或几列)必须是主键,以便定位对象。
此语句适用于具有任何类型字段的对象,尤其适用于序列类型的字段。对于序列和向量,此语句可用于插入新值或向现有字段追加值。若要追加值,必须将 append_mode 设置为 true(这是默认值)。否则,向量或序列值将被覆盖。append_mode 参数通过 SQL 的 set 命令进行修改:
set append_mode true
例如,以下语句将创建一个简单的表,并为序列字段填充 3 个值:
create table t(id string primary key, day sequence(unsigned(4) asc));
insert into t values(1, [1,2,3]);
以下语句会将 3 个值添加到键为 1 的现有对象中:
insert or update into t values(1, [4,5,6]);
以下语句会用新值覆盖现有序列:
set append_mode false
insert or update into t values(1, [7,8,9]);
批量插入
多个 INSERT 语句的远程执行可以进行优化。