南大通用GBase8s 常用SQL语句(116)

    1. DELETE 语句

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

语法

 

元素

描述

限制

语法

alias

在此处为表、视图或同义词声明的临时名称

如果 WHERE 是 alias 的标识符则 AS 关键字必须优先于 alias 

标识符

condition

删除行必须满足的逻辑条件

不能是 UDR 也不能是相关的子查询

条件

cursor_id

先前声明的游标

必须已声明为 FOR UPDATE

标识符

synonym, table, view

带有要删除行的表、同义词或可更新的视图

table 或 view(或 synonym 及其指向的表或视图)必须存在

数据库对象名

用法

使用 DELETE 语句移除以下任意类型的数据库对象或程序对象:

  1. 表中或视图中的行:一行,一组行或所有的行
  2. 集合数据类型的列中的元素
  3. 已命名或未命名 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 级。

决定锁定粒度的功能具有以下顺序的优先级:

  1. DEF_TABLE_LOCKMODE 配置参数可以将表的锁定粒度缺省设置为 PAGE 或 ROW。
  2. 如果 IFX_TABLE_LOCKMODE 环境变量设置成 PAGE 或 ROW,则它的设置会覆盖 DEF_TABLE_LOCKMODE 的缺省值。
  3. CREATE TABLE 语句的 LOCK MODE 子句会覆盖新表的任何任何缺省锁定粒度。
  4. ALTER TABLE 语句的 LOCK MODE 子句可以将表的锁定粒度重置为 PAGE 或 ROW,覆盖任何上述的设置。
  5. LOCK TABLE 语句总是锁定整个表,覆盖指定表的以上列出的锁定粒度规范。

当表的锁定粒度是 ROW 时,数据库服务器对每个受 DELETE 语句影响的页获取一个锁。

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

对类型表使用 ONLY 关键字

当 DELETE 语句指定一个超级表时,任何满足 WHERE 子句的限定的行都会被删除,缺省情况下,表层次结构中所有超表的子表均会删除。要限制 DELETE 超级表的作用域,您必须在超级表的名称或同义词之前指定 ONLY 关键字。

在以下示例中,任何 name 列的具有 johnson 值的行都会从超级表 super_tab 中删除。但是,super_tab 的子表中的 name 列的具有 johnson 值的行会被保留,因为 ONLY( ) 子句限制了超级表的 DELETE 操作:

DELETE FROM ONLY(super_tab)

        WHERE name = "johnson";

警告 如果您在超级表上使用 DELETE 语句并省略了 ONLY 关键字和 WHERE 子句,则会删除超级表及其子表的所有行。

如果您计划使用 WHERE CURRENT OF 子句删除游标的活动集合的当前行,则不能指定 ONLY 关键字。

级联删除表时的注意事项

当使用 CREATE TABLE 或 ALTER TABLE 语句的 REFERENCES 子句的 ON DELETE CASCADE 选项时,即指定了您想从一个表级联地删除到另一个表。例如,在 stores_demo 数据库中,stock 表包含作为主键的列 stock_numcatalog 和 items 表中每一个表都包含作为外键的用 ON DELETE CASCADE 选项指定的列 stock_num 。当从 stock 表执行删除操作是,也会在 catalog 和 items 表(这两个表通过外键引用)中删除行。

要使 DELETE 操作级联到一个含有对父表的引用约束的表,您只需要拥有对 DELETE 语句中的引用的父表的 Delect 特权。

如果使用级联删除一个或多个子表引用的表执行不带 WHERE 子句的 DELETE 操作,则 GBase 8s 从该表及其任何受影响的子表删除所有的行。(这类似于 TRUNCATE 语句的作用,但是在具有子表引用它的表上 GBase 8s 不支持 TRUNCATE 操作。)

有关如何创建使用级联删除的引用约束的示例,请参阅使用 ON DELETE CASCADE 选项。

表有级联删除时对 DELETE 的限制

你不可以使用相关子查询查询中的子表从父表删除行。如果两个子表引用相同的父表,并且一个子表指定级联删除但另一个子表没有指定,那么如果您尝试从父表中删除同时应用于这两个子表的行,则删除失败,并且不会从父表或子表删除任何行。

级联删除的锁定和记录日志牵连

在删除期间,数据库服务器会在被引用的表以及正在引用的表的所有符合条件的行上放置锁。

GBase 8s 要求对级联删除进行事务日志记录。如果在不符合 ANSI 的数据库中改变日志记录,即使是临时关闭,那么删除操作也不会级联地执行,因为您无法回滚任何操作。例如,如果删除一个父行,但在删除子行之前系统发生故障,那么数据库将含有悬挂的子记录,这违反了参照完整性。但是,在重新打开日志记录之后,随后的删除是级联的。

使用 WHERE 关键字指定条件

使用 WHERE condition 子句指定您要从表中删除的行。WHERE 关键字之后的 condition 等同于 SELECT 或 UPDATE 语句中的 condition 。例如,下一个语句删除了顺序号小于 1034 的 items 表的所有行:

DELETE FROM items WHERE order_num < 1034;

在 DB-Access 中,如果包含了选择表中所有行的 WHERE 子句,则 DB-Access 不会给出任何提示,并且删除所有行。

如果正在从表层次结构中的超级表删除,则 WHERE 子句的子查询无法引用子表。

当正从子表删除的时候,WHERE 子句中的子查询只可以在 SELECT … FROM ONLY (supertable)... 语法中引用超级表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值