返回首页

gbase数据、南大通用产品文档:GBase8sDELETE 语句

更新日期:2024年09月11日

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

元素
描述
限制
语法
alias
在此处为表、视图
或同义词声明的临
时名称
如果 WHERE 是 alias 的标识
符则 AS 关键字必须优先于
alias
标识符
condition
删除行必须满足的
逻辑条件
不能是 UDR 也不能是相关的
子查询
条件

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 540
元素
描述
限制
语法
cursor_id
先前声明的游标
必须已声明为 FOR UPDATE
标识符
synonym,
table,
view
带有要删除行的
表、同义词或可更
新的视图
table 或 view(或 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 语句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 541
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 语句总是锁定整个表,覆盖指定表的以上列出的锁定粒度
规范。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 542
当表的锁定粒度是 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_num。catalog
和 items 表中每一个表都包含作为外键的用 ON DELETE CASCADE 选项指定的
列 stock_num 。当从 stock 表执行删除操作是,也会在 catalog 和 items 表
(这两个表通过外键引用)中删除行。
要使 DELETE 操作级联到一个含有对父表的引用约束的表,您只需要拥有对
DELETE 语句中的引用的父表的 Delect 特权。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 543
如果使用级联删除一个或多个子表引用的表执行不带 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 子句的子查询无法引用子
表。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 544
当正从子表删除的时候,WHERE 子句中的子查询只可以在 SELECT … FROM
ONLY (supertable)... 语法中引用超级表。
DELETE 的 WHERE 子句中的子查询
DELETE 语句的 WHERE 子句中的子查询 FROM 子句可以将 DELETE 语句的
FORM 子句指定的同一个表或视图指定为数据源。仅当所有以下条件为真时,才
支持带有引用相同表对象的子查询的 DELETE 操作:

该子查询要么返回一行,要么具有不相关列引用。

该子查询在 DELETE 语句的 WHERE 子句中,使用 Condition with
Subquery 语法。

任何子查询中的 SPL 例程不能引用正在修改的表。
除非以上这些条件都满足,否则包含引用同 DELETE 语句修改的相同的表或视
图子查询的 DELETE 语句返回错误 -360。
以下示例从 orders 表中删除其中 paid_date 列值满足 WHERE 子句中条件的行
的子集。WHERE 子句通过将 IN 运算符应用于子查询返回的行来指定要删除的
行,该子查询只选择 orders 表中的行,其中 paid_date 值早于当前日期:
DELETE FROM orders WHERE paid_date IN
(SELECT paid_date FROM orders WHERE paid_date < CURRENT );
该子查询仅包含不相关的列引用,因为其唯一引用的列位于 FORM 子句中指定
的表中。上面列出的要求有效,因为子查询的数据源与外部 UPDATE 语句的
FROM 子句指定的顺序表相同。上一个示例说明了 GBase 8s 支持 DELETE 语
句的 WHERE 子句中不相关子查询。而不是如何写短 SQL 语句。下一示例使用
更简单的语法实现了相同的结果:
DELETE orders WHERE paid_date < CURRENT;
以下示例从 stock 表中删除具有最大 unit_price 值的行(或多行)。WHERE 子
句通过将等于运算符应用于子查询的结果来确定哪个 unit_price 值最大,子查询
调用 unit_price 列值的内置 MAX 聚合函数:
DELETE FROM stock WHERE unit_price =
(SELECT MAX(unit_price) FROM stock );

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 545
如果作为修改相同表的 DELETE 语句的 WHERE 子句中的子查询的数据源的表
上定义了已启用的 Select 触发器,则在 DELETE 语句中执行该子查询不会激活
触发器。
DELETE 语句中的子查询可以包含 UNION 或 UNION ALL 运算符。
如果外部 DELETE 语句修改表层次结构中的类型表, GBase 8s 支持在 DELETE
的 WHERE 子句中使用有效子查询的所有以下操作:

从带有( SELECT from parent table )子查询的父表中 DELETE

从带有( SELECT from child table )子查询的父表中 DELETE

从带有( SELECT from parent table )子查询的子表中 DELETE

从带有( SELECT from child table)子查询的子表中 DELETE 。
请参阅 子查询的条件主题以获取有关 DELETE 语句的 WHERE 子句中将多行
返回为谓词的子查询的语法的更多信息。
为表声明别名
可以为表声明别名。别名可以引用本地或远程表、视图或同义词的完全限定数据
库对象名称。
别名是未在数据库的系统目录中注册临时的名称,而且只有在 DELETE 语句运
行时才会保留。
如果您声明为别名的名称是关键字 WHERE,则必须使用 AS 关键字来说明语法:
DELETE stock AS where
WHERE manu_code =
(SELECT manu_code FROM where WHERE manu_code MATCHES 'H*');
因为 where 是 DELETE 和 SELECT 的关键字,所以之前的示例不易读取。以下示
例访问远程表而不声明表的别名:
DELETE overstock@cleveland:stock AS ocs
WHERE manu_code =
(SELECT manu_code FROM overstock@cleveland:stock
WHERE manu_code MATCHES 'H*');
;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 546
下一个示例在逻辑上等同于前一个 DELETE 语句,但通过将 ocs 声明为引用子
查询中的相同表的别名来简化符号:
DELETE overstock@cleveland:stock AS ocs
WHERE manu_code =
(SELECT manu_code FROM ocs WHERE manu_code MATCHES 'H*');
使用 WHERE CURRENT OF 关键字(ESQL/C, SPL)
WHERE CURRENT OF 子句删除一个游标的活动集合的当前行。当包括这个子句
时,DELETE 语句会在游标的当前位置处除去活动集合的行。在删除之后,没有
任何当前的行存在;您无法使用游标删除或更新行,直到您使用 FETCH 语句
(ESQL/C 例程中)或 FOREACH 语句( SPL 例程中)重新确定游标的位置。
你可以使用更新游标来访问游标的活动集合的当前行。在可以使用 WHERE
CURRENT OF 子句之前,您必须通过使用 FOREACH 语句(SPL 中)或使用带
FOR UPDATE 子句( GBase 8s ESQL/C 中)的 DECLARE 语句。跟在 OF 关
键字之后的 cursor_id 不能通过 SPL 例程中的 DECLARE 声明。
除非使用 FOR READ ONLY 关键字声明所有 Select 游标,否则所有 Select 游
标在兼容 ANSI 的数据库中均是潜在的更新游标。您可以将 WHERE CURRENT
OF 子句与没有用 FOR READ ONLY 关键字声明的任何 Select 游标一起使用。
如果您只从表层次结构中的一个表进行选择,则不可以使用 WHERE CURRENT
OF 。即这个子句对 ONLY 关键字无效。
通过删除集合变量控制的集合派生的表的当前行,WHERE CURRENT OF 子句可
用于从集合删除元素。有关更多信息,请参阅集合派生表。
删除包含不透明数据类型的行
当删除一些不透明数据类型的时,它们需要特别的处理过程。例如,如果不透明
数据类型包含占数据库空间的或多重表示的数据,则它可能提供如何存储该数据
的选项:在内部结构中或者在智能大对象中(对于大对象)。
要完成此进程,应调用一个称为 destroy( ) 的用户定义的支持函数。当使用
DELETE 除去包含这些不透明数据类型的其中一种的行的时,数据库服务器会自
动对该不透明数据类型调用 destroy( ) 。此函数决定如何除去数据,不管它存储

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 547
在什么地方。有关对 destroy( ) 支持函数的更多信息,请参阅 GBase 8s 用户定
义的例程和数据类型开发者指南 。
删除包含集合数据类型的行
当行包含集合数据类型的列(LIST 、MULTISET 或 SET),您可以在集合中搜
寻特定的元素,并且删除在其中发现该元素的一行或多行。
例如,以下的示例从 new_tab 表中删除其中的 set_col 列包含元素 jimmy
smith 的任何行:
DELETE FROM new_tab WHERE 'jimmy smith' IN set_col;
您也可以通过删除集合中一个或多个个别元素使用集合变量删除集合列中的值。
有关更多信息,请参阅 集合派生表 和 数据库名 和 从集合中执行删除操作的示
例 中的示例。
分布式 DELETE 操作中的数据类型
访问另一个 GBase 8s 实例的数据库的 DELETE 语句(或其它 SQL 数据操纵语
言语句)只能引用以下数据类型:

不透明的内置数据类型

BOOLEAN

LVARCHAR

不透明的内置数据类型的 DISTINCT

BOOLEAN DISTINCT

LVARCHAR DISTINCT

出现在此列表中的任何 DISTINCT 数据类型的 DISTINCT
如果 DISTINCT 类型显式地强制转型为内置类型,并且所有的 DISTINCT 类
型、它们的数据类型层次结构以及它们的强制转型在按同一方式定义在每个参与
操作的数据库中,则跨服务器分布式 DELETE 操作可以支持这些 DISTINCT 类
型。
跨服务器的 DML 操作不能引用复杂、大对象或者用户定义的不透明数据类型
(UDT),或者不支持的 DISTINCT 类型或内置不透明类型的列或表达式。有关
GBase 8s 在跨服务器 DML 操作中支持的数据类型的其它信息,请参阅跨服务器
事务中的数据类型。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 548
但是,访问本地 GBase 8s 实例的其它数据库的分布式操作可以访问上述为跨服
务器操作列出的数据类型,也能访问下列其它的数据类型大多数内置的不透明
的:

大多数内置的不透明数据类型,如跨数据库事务中的数据类型 中所列

上面一行中引用的内置类型的 DISTINCT

上面两行中列出的任何数据类型的 DISTINCT

可以显式强制转型为内置数据类型的不透明的用户定义的数据类型
(UDT)
如果所有的不透明和 DISTINCT UDT 都显式地强制转型成内置类型,同时所有
的 UDT 、DISTINCT 类型,以及强制转型都定义在每个参与操作的数据库中,
那么跨数据库的 DELETE 操作支持这些 DISTINCT 和不透明的 UDT 。
分布式 DELETE 不能访问另一个 GBase 8s 实例的数据库,除非这两个服务器在
DBSERVERNAME 或 DBSERVERALIASES 配置参数中定义了 TCP/IP 或
IPCSTR 连接。这一连接类型要求适用于 GBase 8s 实例间的所有通信,即使这两
个数据库服务器都驻留在同一台计算机上。
兼容 ANSI 的数据库中的 SQLSTATE 值
如果没有任何行满足对 兼容 ANSI 的数据库中的表执行的 DELETE 操作的
WHERE 子句,那么数据库服务器会发出一个警告。可以下列方式之一检测此警
告条件:

GET DIAGNOSTICS 语句将 RETURNED_SQLSTATE 字段设置为值
02000。在 SQL API 应用程序中,SQLSTATE 变量包含这个相同的
值。

SQL API 应用程序中,sqlca.sqlcode 和 SQLCODE 变量包含值 100。
如果 DELETE . . . WHERE 语句是多语句预备对象的一部分,并且数据库服务器
不返回任何行,则数据库服务器还将 SQLSTATE 和 SQLCODE 设置为这些
值。
在不兼容 ANSI 的数据库中的 SQLSTATE 值
在不兼容 ANSI 的数据库中,当数据库服务器没有找到满足 DELETE 语句的
WHERE 子句的行时,不会返回警告。在这种情况下,SQLSTATE 代码为
00000 且 SQLCODE 代码为零(0)。但是如果 DELETE . . . WHERE 是多语

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 549
句的预备对象的一部分,且没有返回任何行,则数据库服务器会发出一个警告。
它将 SQLSTATE 设置为 02000 ,将 SQLCODE 值设置为 100。
有关返回 SQLSTATE 变量的值的 ANSI/ISO 兼容状态的信息,请参阅
SQLSTATE 支持 SQL 的 ANSI/ISO 标准一节。

SQLDescribeCol 返回结果集中一列的详细信息(列名、类型、精度、小数位数和它是否具
有 NULL 值)。
它不能用于返回有关标记列(列 0)的信息。
下表描述了 SQLDescribeCol 的 SQLSTATE 和错误值。
SQLSTATE
错误值
错误消息

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 217 -
SQLSTATE
错误值
错误消息
01000
-11001
General warning
01004
-11003
Data truncated
24000
-11031
Invalid cursor state
S1000
-11060
General error
S1001
-11061
Memory-allocation failure
S1002
-11062
Invalid column number
S1008
-11065
Operation canceled
S1010
-11067
Function-sequence error
S1090
-11071
Invalid string or buffer length
S1T00
-11094
Time-out expired
当在 SQLPrepare 之后 SQLExecute 之前调用 SQLDescribeCol 时,SQLDescribeCol 可以
返回 SQLPrepare 或 SQLExecute 返回的任何 SQLSTATE。
具体取决于数据源何时评估与
hstmt 关联的 SQL 语句。

功能说明
数据库内存堆使用统计信息。
表结构说明
表5- 318 表结构信息说明:




HOST
本节点名称
HEAP_TYPE
数据堆的类型
数据对堆类型说明:
dc_heap:数据包缓存堆
temp_heap:临时内存堆
large_heap:大内存缓存堆
HEAP_SIZE
数据堆size
USED_IN_HEAP
数据堆内已经使用的内存size
USED_IN_SYSTEM
当数据堆不能分配内存时,
从系统堆中分配的内存size
MAX_USED_BLOCK
数据堆内已分配最大内存块的size
MAX_FREE_BLOCK
数据堆内最大free 内存块的size
USED_BLOCKS
数据堆内已分配的内存块数量

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1515