此语句用于将单行(语法 1)或从数据库的其它位置选择的一组行(语法 2)插入到表中。
INSERT [ INTO ] [ owner.]table-name [ ( column-name, ... ) ] [ ON EXISTING { ERROR | SKIP | UPDATE [ DEFAULTS { ON | OFF } ] } ] { DEFAULT VALUES | VALUES ( [ expression | DEFAULT, ...) ] } [ OPTION( query-hint, ... ) ]
INSERT [ INTO ] [ owner.]table-name [ ( column-name, ... ) ] [ ON EXISTING { ERROR | SKIP | UPDATE [ DEFAULTS { ON | OFF } ] } ] [ WITH AUTO NAME ] select-statement [ OPTION( query-hint, ... ) ]
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | option-name = option-value
option-name : identifier
option-value : hostvar (indicator allowed), string, identifier, or number
VALUES 子句 使用 VALUES 子句可指定要插入的值。如果要插入为列定义的缺省值,请指定 DEFAULT VALUES。还可指定 VALUES (),其等价于 DEFAULT VALUES。
WITH AUTO NAME 子句 WITH AUTO NAME 仅适用于语法 2。如果指定 WITH AUTO NAME,则 SELECT 语句中的项的名称确定这些数据属于哪个列。SELECT 语句项应当是列引用或带别名的表达式。SELECT 语句中未定义的目标列将被赋予缺省值。当目标表中所包含的列数很大时,可以使用此子句。
ON EXISTING 子句 INSERT 语句的 ON EXISTING 子句对这两种语法都适用。它根据主键查找将表中的现有行更新为新列值。此子句仅可用于拥有主键的表。如果尝试对没有主键的表使用此子句,则将造成语法错误。不能使用 ON EXISTING 子句向代理表插入值。
如果预期有许多满足 ON EXISTING 条件的行,则应考虑使用 MERGE 语句。MERGE 语句提供更多对用于匹配行的操作的控制。该语句还提供更复杂的语法来定义构成匹配的元素。请参见MERGE 语句。
如果指定 ON EXISTING 子句,则数据库服务器为每个输入行分别执行主键查找。如果表中不存在对应的行,它会插入新行。对于表中已经存在的行,您可以选择在没有任何提示的情况下忽略输入行 (SKIP),为重复键值生成错误消息 (ERROR),或使用输入行中的值更新旧值 (UPDATE)。缺省情况下,如果未指定 ON EXISTING 子句,则在尝试向表中插入行时,如果相应的行已存在,则会造成重复键值错误,而这相当于指定 ON EXISTING ERROR 子句。
当使用 ON EXISTING UPDATE 子句时,将输入行与存储行进行比较。在输入行中显式指定的任何列值将替换存储行中的相应列值。同样,如果未在输入行中显式指定列值,则不会更改存储行中的相应列值—具有缺省值的列除外。在将 ON EXISTING UPDATE 子句用于有缺省值的列(包括 DEFAULT AUTOINCREMENT 列)时,您可进一步指定是通过指定 ON EXISTING UPDATE DEFAULTS ON 来更新具有缺省值的列值,还是通过指定 ON EXISTING UPDATE DEFAULTS OFF 使列值保持原样。如果未做任何指定,则缺省行为将是 ON EXISTING UPDATE DEFAULTS OFF。
DEFAULTS ON 和 DEFAULTS OFF 参数不会影响 DEFAULT TIMESTAMP、DEFAULT UTC TIMESTAMP 或 DEFAULT LAST USER 中的值。对于这些列,在执行 UPDATE 期间会始终更新存储行中的值。
CREATE TABLE t1( c1 INT PRIMARY KEY, c2 INT DEFAULT AUTOINCREMENT ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 20 ); INSERT INTO t1( c1 ) ON EXISTING SKIP VALUES( 30 ); |
插入在第一个 INSERT 语句中定义的行,并且将 c2 设置为 1。在第二个 INSERT 语句中定义的行将被跳过,原因是它与现有的行匹配。但是,自动增量计数器仍然会增量到 2(不过不会影响现有行)。插入在第三个 INSERT 语句中定义的行,将 c2 的值设置为 3。因此,以上示例的插入值是:
20,1 30,3 |
如果正在使用 SQL Remote,则请勿复制 DEFAULT LAST USER 列。复制列以后,列值会设置为 SQL Remote 用户,而不是所复制的值。
OPTION 子句 此子句用于指定执行语句时的提示。支持以下提示:
有关这些选项的说明,请参见SELECT 语句的 OPTIONS 子句。
INSERT 语句用于将新行添加到数据库表中。
由于对基础表数据的更改影响文本索引和实例化视图,因此在将数据批量装载(LOAD TABLE、INSERT、MERGE)到基础表之前,考虑截断相关的文件索引或实例化视图。请参见TRUNCATE 语句和TRUNCATE TEXT INDEX 语句。
语法 1 插入包含指定表达式列值的单个行。关键字 DEFAULT 可用于插入列的缺省值。如果给出可选的列名列表,则值将逐个插入到指定的列中。如果未指定列名的列表,则值将以创建时所使用的顺序(与用 SELECT * 检索的顺序相同)插入到表列中。行插入到表中的任意位置。(在关系数据库中,表是不排序的)。
语法 2 向表中执行大量插入,其中包含完全通用的 SELECT 语句的结果。除非 SELECT 语句包含 ORDER BY 子句,否则插入将以任意顺序进行。请参见SELECT 语句。
如果指定列名称,选择列表中的列将按顺序与列列表中指定的列匹配,或者按这些列的创建顺序匹配。
如果定义视图的查询说明是可更新的,则可以对视图执行插入操作。有关识别固有不可更新的 视图的详细信息,请参见使用常规视图。
插入到表中的字符串始终以它们输入时采用的大小写进行保存,而不论数据库是否区分大小写。因此,插入到表中的字符串 Value 在数据库中保存时 V 始终为大写,其余的字母为小写。SELECT 语句返回的字符串为 Value。但是,如果数据库不区分大小写,所有比较都会将 Value 与 value、VALUE 等不同大小写形式的字符串视为相同。而且,如果单列主键已经包含 Value 条目,则会拒绝对 value 执行 INSERT,因为它会导致主键不唯一。
使用 INSERT 语句插入大量数据也会更新列的统计信息。
要将许多行插入到表中,应尽可能声明一个游标并通过游标插入行,这比执行许多单独的 INSERT 语句效率要高。插入数据之前,可以指定每个表页上保留供以后的更新使用的可用空间的百分比。请参见ALTER TABLE 语句。
必须有表的 INSERT 权限。
如果指定了 ON EXISTING UPDATE 子句,还需要具有表的 UPDATE 权限。
无。
SQL/2003 核心特性。INSERT ...ON EXISTING 是服务商扩充。
将 Eastern Sales 部门添加到数据库。
INSERT INTO Departments ( DepartmentID, DepartmentName ) VALUES ( 230, 'Eastern Sales' ); |
创建表 DepartmentHead,然后使用 WITH AUTO NAME 语法用部门主管姓名和部门名填充该表。
CREATE TABLE DepartmentHead( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, DepartmentName VARCHAR(128), ManagerName VARCHAR(128) ); INSERT INTO DepartmentHead WITH AUTO NAME SELECT GivenName || ' ' || Surname AS ManagerName, DepartmentName FROM Employees JOIN Departments ON EmployeeID = DepartmentHeadID; |
创建表 MyTable5,并使用 WITH AUTO NAME 语法填充此表。
CREATE TABLE MyTable5( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, TableName CHAR(128), TableNameLen INT ); INSERT INTO MyTable5 WITH AUTO NAME SELECT length(t.table_name) AS TableNameLen, t.table_name AS TableName FROM SYS.SYSTAB t WHERE table_id <= 10; |
以隔离级别 3 而不是使用数据库的当前隔离级别设置执行此语句,插入新部门。
INSERT INTO Departments (DepartmentID, DepartmentName, DepartmentHeadID) VALUES(600, 'Foreign Sales', 129) OPTION( isolation_level = 3 ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |