首页 > 解决方案 > 如何在 Oracle SQL 中从 JDBC 约束外键的 2 个表中删除

问题描述

基本上,我需要知道 SQL 查询来执行 JDBC 编码。我用以下查询制作了我的表:

CREATE TABLE MASTER 
(
    ROOM_ID NUMBER NOT NULL PRIMARY KEY,
    MARKET VARCHAR2(3 CHAR)  NOT NULL,
    MODIFIED_DATE DATE,
    MODIFIED_BY VARCHAR2(60 CHAR)
);

CREATE TABLE FEATURES
(
    MASTER_ROOM_ID NUMBER NOT NULL,
    ELEMENT NUMBER NOT NULL,
    MODIFIED_DATE DATE,
    MODIFIED_BY VARCHAR2(60 CHAR),

    CONSTRAINT FK_MASTER_FEATURES 
        FOREIGN KEY (MASTER_ROOM_ID) REFERENCES MASTER (ROOM_ID)  
                ON DELETE CASCADE
);

然后尝试删除为:

DELETE MASTER FEATURES 
JOIN FEATURES ON room_id = master_room_id 
WHERE room_id = master_room_id;

这不是一个有效的查询。怎么做?

更新的问题:它在删除级联。当我删除时delete from master where market = 'xxx';它只删除主表行。不是来自功能。有人评论说我必须先从 Features 表中删除。但问题是我不能先从特征表中删除。我想被市场删除。对于功能表,我只知道 MASTER_ROOM_ID,它是功能表的外键。那么我怎样才能写一个查询先从特征表中删除呢?请告诉我怎么做?

标签: sqloraclejdbcsql-delete

解决方案


如果 FK 确实是使用 ON DELETE CASCADE 创建的,那么从 MASTER删除将从这里的特征表演示中删除

如果 FK 不是使用 ON DELETE CASCADE 创建的,那么只要至少有一个特性在此处演示引用它,master 上的删除就会失败

在这种情况下,您需要features使用子查询从第一次删除以找到正确的行:

delete from features
where master_room_id in (select room_id
                         from master
                         where marked = 'm1');

然后你可以从主表中删除:

delete from master
where marked = 'm1';

演示在这里


推荐阅读