跳到主要内容

Oracle 如何实现级联删除?

参考答案:

在 Oracle 数据库中,级联删除(Cascading Delete)是一种在删除主表中的记录时自动删除相关从表中的相关记录的功能。这通常通过定义外键约束并设置其删除规则为 CASCADE 来实现。

以下是如何在 Oracle 中实现级联删除的步骤:

  1. 创建主表和从表

首先,假设我们有两个表,一个是主表(parent_table),另一个是从表(child_table)。从表中有一个外键引用主表的主键。

CREATE TABLE parent_table (
    parent_id NUMBER PRIMARY KEY,
    parent_name VARCHAR2(50)
);

CREATE TABLE child_table (
    child_id NUMBER PRIMARY KEY,
    parent_id NUMBER,
    child_name VARCHAR2(50),
    FOREIGN KEY (parent_id) REFERENCES parent_table(parent_id) ON DELETE CASCADE
);

注意,在上面的 child_table 定义中,我们为 parent_id 列设置了一个外键约束,并指定了 ON DELETE CASCADE。这意味着当 parent_table 中的记录被删除时,所有在 child_table 中引用该记录的记录也会被自动删除。 2. 插入数据

为了演示级联删除,我们向这两个表中插入一些数据。

INSERT INTO parent_table (parent_id, parent_name) VALUES (1, 'Parent A');
INSERT INTO child_table (child_id, parent_id, child_name) VALUES (1, 1, 'Child A1');
INSERT INTO child_table (child_id, parent_id, child_name) VALUES (2, 1, 'Child A2');
  1. 执行级联删除

现在,如果我们从 parent_table 中删除一个记录,所有在 child_table 中引用该记录的记录也会被自动删除。

DELETE FROM parent_table WHERE parent_id = 1;

执行上述 DELETE 语句后,不仅 parent_tableparent_id 为 1 的记录会被删除,而且 child_table 中所有 parent_id 为 1 的记录也会被自动删除。 4. 验证结果

你可以查询这两个表来验证记录是否已被正确删除。

SELECT * FROM parent_table WHERE parent_id = 1;  -- 应该没有结果
SELECT * FROM child_table WHERE parent_id = 1;   -- 也应该没有结果

请注意,级联删除是一个强大的功能,但也需要谨慎使用。在删除主表记录时,它会自动删除大量相关的从表记录,这可能会影响数据库的性能并可能导致数据丢失(如果未正确备份)。因此,在决定使用级联删除之前,请确保你完全理解其影响,并在必要时进行充分的测试。