DELETE 语句

使用 DELETE 语句从表中删除一行或多行,或者在 SPL 或 GBase 8s ESQL/C 的集合变量中删除一个或多个元素。

语法

元素 描述 限制 语法
alias 在此处为表、视图或同义词声明的临时名称 如果 WHERE 是 alias 的标识符则 AS 关键字必须优先于 alias 标识符
condition 删除行必须满足的逻辑条件 不能是 UDR 也不能是相关的子查询 条件
cursor_id 先前声明的游标 必须已声明为 FOR UPDATE 标识符
synonym, table, view 带有要删除行的表、同义词或可更新的视图 tableview(或 synonym 及其指向的表或视图)必须存在 数据库对象名

用法

使用 DELETE 语句移除以下任意类型的数据库对象或程序对象:
  • 表中或视图中的行:一行,一组行或所有的行
  • 集合数据类型的列中的元素
  • 已命名或未命名 ROW 数据类型的列、一个字段或所有字段。

您还可以使用此语句移除 GBase 8s ESQL/C 或 SPL 集合变量或 ROW 变量中的一个或多个元素的值。

要执行 DELETE 语句,您必须拥有数据库上的 DBA 访问权限,或者表的 Delete 存取权限。

在带有显式事务日志记录的数据库中,任何在事务之外执行的 DELETE 语句都将作为一个单独的事务来对待。

如果指定视图名称,则该视图必须是可更新的。有关对可更新视图的解释,请参阅通过视图更新

DELETE 语句不能引用 CREATE EXTERNAL TABLE 语句定义的表对象。

如果您使用不带 WHERE 子句的 DELETE (指定一个条件或游标的活动集合),表中所有的行都会被删除。但是,若要移除表中所有的行,使用 TRUNCATE 语句会比 DELETE 语句更有效率。

在 DB-Access 中,如果您在 SQL 菜单工作时,省略 WHERE 子句,则 DB-Access 会提示您确认是否要删除表中所有的行。如果在命令文件中执行 DELETE 语句,则不会收到提示。

在兼容 ANSI 的数据库中,数据操作语言(DML)语句通常都在事务中。您无法在事务外执行 DELETE 语句。

FROM 子句

FROM 关键字优先于目标表的名称是可选的。要删除名为 from 的表中的行,可以设置 DELIMIDENT 环境变量并使用引号(" )分隔 "from"

DELETE "from";

另一种方法是,可以使用表所有者的名称限定 from 表的名称:

DELETE zelaine.from;

但是,如果您避免将 SQL 关键字声明为表、视图或其它数据库对象的标识符,则 SQL代码会比较容易读取和维护。

WHERE 子句

如果使用不带 WHERE 子句(指定一个条件或游标的活动集合)的 DELETE ,则会删除表中所有的行。但是,若要移除表中所有的行,使用 TRUNCATE 语句会比 DELETE 语句更有效率。

在 DB-Access 中,如果您在 SQL 菜单工作时,省略 WHERE 子句,则 DB-Access 会提示您确认是否要删除表中所有的行。如果在命令文件中执行 DELETE 语句,则不会收到提示。

锁定注意事项

数据库服务器在事务期间锁定该事务内每个受 DELETE 语句影响的行。该表锁定粒度的可以是 PAGE 级或 ROW 级。

决定锁定粒度的功能具有以下顺序的优先级:
  • DEF_TABLE_LOCKMODE 配置参数可以将表的锁定粒度缺省设置为 PAGE 或 ROW。
  • 如果 IFX_TABLE_LOCKMODE 环境变量设置成 PAGE 或 ROW,则它的设置会覆盖 DEF_TABLE_LOCKMODE 的缺省值。
  • CREATE TABLE 语句的 LOCK MODE 子句会覆盖新表的任何任何缺省锁定粒度。
  • ALTER TABLE 语句的 LOCK MODE 子句可以将表的锁定粒度重置为 PAGE 或 ROW,覆盖任何上述的设置。
  • LOCK TABLE 语句总是锁定整个表,覆盖指定表的以上列出的锁定粒度规范。
当表的锁定粒度是 ROW 时,数据库服务器对每个受 DELETE 语句影响的页获取一个锁。

如果影响的行的数量很大,且锁定方式为 ROW ,则可能超过操作系统对同时发生的锁的最大数目所置的限制。如果发生这种情况,您可以在执行 DELETE 语句之前减小 DELETE 语句的范围或者以互斥方式用 LOCK TABLE 语句锁定表。

1 GBase 8s 扩展
2 请参阅 对类型表使用 ONLY 关键字
3 请参阅 为表声明别名
4 仅限于 ESQL/C 和存储过程语言
5 请参阅 优化程序伪指令
6 请参阅 集合派生表
7 请参阅 使用 WHERE 关键字指定条件
8 请参阅 使用 WHERE CURRENT OF 关键字(ESQL/C, SPL)