Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (E-O)

 

INSERT 语句

此语句用于将单行(语法 1)或从数据库的其它位置选择的一组行(语法 2)插入到表中。

语法 1
INSERT [ INTO ] [ owner.]table-name [ ( column-name, ... ) ]
[ ON EXISTING { 
   ERROR 
   | SKIP 
   | UPDATE [ DEFAULTS { ON | OFF } ] 
   } ]
{ DEFAULT VALUES 
   | VALUES ( [ expression | DEFAULT, ...) ] }
[ OPTION( query-hint, ... ) ]
语法 2
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 期间会始终更新存储行中的值。

    使用 ON EXISTING SKIP 和 ON EXISTING ERROR 子句时,如果表包含缺省列,则服务器会计算缺省值,即使对于已存在的行也会如此。因此,缺省值(例如 AUTOINCREMENT)即使对跳过的行也会产生副作用。对于本例中的 AUTOINCREMENT,这导致在 AUTOINCREMENT 序列中跳过某些值。以下示例对此进行说明:
    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 子句   此子句用于指定执行语句时的提示。支持以下提示:

    • MATERIALIZED VIEW OPTIMIZATION option-value
    • FORCE OPTIMIZATION
    • FORCE NO OPTIMIZATION
    • option-name = option-value

    有关这些选项的说明,请参见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 );