gpt4 book ai didi

sql - 更新数据库表

转载 作者:行者123 更新时间:2023-12-04 14:33:24 25 4
gpt4 key购买 nike

我有以下数据库表:enter image description here

在这些表中,我有以下元素:

  • Container :可以包含任何 container_item 元素;该关系使用表 CONTAINER_CANDIDATES
  • 存储
  • Container_Item:可以包含任何元素item;该关系使用表 COMPOUNDS
  • 存储
  • 元素:我系统中的基本元素。

  • 让我用一个具体的案例来表达这个问题:

    在表 ELEMENTS 中,我可以存储以下元素:
    Id = 1 ; ElementName = 'element001'
    Id = 2 ; ElementName = 'element002'
    Id = 3 ; ElementName = 'element003'
    Id = 4 ; ElementName = 'element004'
    Id = 5 ; ElementName = 'element005'
    Id = 6 ; ElementName = 'element006'
    Id = 7 ; ElementName = 'element007'

    在表 CONTAINER_ITEM 中,我可以存储以下元素:
    Id = 1 ; ContainerItemName = 'item-id-aaa'
    Id = 2 ; ContainerItemName = 'item-id-bbb'
    Id = 3 ; ContainerItemName = 'item-id-ccc'
    Id = 4 ; ContainerItemName = 'item-id-ddd'
    Id = 5 ; ContainerItemName = 'item-id-eee'

    在表 CONTAINER 中,我可以存储以下元素:
    Id = 1; ContainerName = 'ContainerName01';
    Id = 2; ContainerName = 'ContainerName02';

    使用表 COMPOUNDS 我进行以下连接:
        - item-id-aaa  (id = 1 in Container_Item table)
    -> element001 (id = 1 in Elements table)
    -> element002 (id = 2 in Elements table)
    - item-id-bbb (id = 2 in Container_Item table)
    -> element003 (id = 3 in Elements table)
    -> element004 (id = 4 in Elements table)
    - item-id-ccc (id = 3 in Container_Item table)
    -> element005 (id = 5 in Elements table)
    -> element006 (id = 6 in Elements table)
    - item-id-ddd (id = 4 in Container_Item table)
    -> element005 (id = 5 in Elements table)
    -> element007 (id = 7 in Elemens table);
    - item-id-eee (id = 5 in Container_Item table)
    -> element-007 (id = 7 in Elemens table)

    使用表 CONTAINER_CANDIDATES 我进行以下连接:
            - ContainerName01 contains the following :
    -> item-id-aaa (id = 1 in Container_Item table)
    -> item-id-bbb (id = 2 in COntainer_Item table)
    -> item-id-ccc (id = 3 in COntainer_Item table)
    -> item-id-ddd (id = 4 in COntainer_Item table)
    - ContainerName02 contains the following:
    -> item-id-aaa (id = 1 in Container_Item table)
    -> item-id-eee (id = 5 in COntainer_Item table)

    因此,我以这种方式创建了所有连接。
    现在的问题是如何删除 ContainerName01 及其下的所有项目(容器项目和其下的元素),以便其他容器(例如:ContainerName02)不受影响?

    我想使用 Oracle PL SQL 过程来实现这一点

    最佳答案

    好的,如果您遵循良好的做法,这不是一个真正的难题。

    首先,您有两个“多对多”跳转表( CONTAINER_CANDIDATESCOMPOUNDS ),因为这些中的孤行完全没有用,我们将添加一个 DELETE CASCADE在他们。

    ALTER TABLE CONTAINER_CANDIDATES
    ADD CONSTRAINT FK_CC_CONTAINER
    FOREIGN KEY (CONTAINERID)
    REFERENCES CONTAINER (ID)
    ON DELETE CASCADE;

    ALTER TABLE CONTAINER_CANDIDATES
    ADD CONSTRAINT FK_CC_CONTAINER_ITEM
    FOREIGN KEY (CONTAINERITEMID)
    REFERENCES CONTAINER_ITEM (ID)
    ON DELETE CASCADE;

    ALTER TABLE COMPOUNDS
    ADD CONSTRAINT FK_COMPOUNDS_CONTAINER_ITEM
    FOREIGN KEY (CONTAINERITEMID)
    REFERENCES CONTAINER_ITEM (ID)
    ON DELETE CASCADE;

    ALTER TABLE COMPOUNDS
    ADD CONSTRAINT FK_COMPOUNDS_ELEMENTS
    FOREIGN KEY (ELEMENTSID)
    REFERENCES ELEMENTS (ID)
    ON DELETE CASCADE;

    现在,事情几乎可以自己工作了,一个小的存储过程可以确保我们不会闲置 CONTAINER_ITEMELEMENTS我们很好。
    CREATE OR REPLACE PROCEDURE cascaded_delete_container (
    P_CONTAINER_ID VARCHAR2
    ) IS
    BEGIN
    -- remove the master from supplied ID
    -- cascade on CONTAINER_CANDIDATES
    DELETE FROM CONTAINER
    WHERE ID = P_CONTAINER_ID;

    -- remove CONTAINER_ITEM not used in CONTAINER_CANDIDATES
    -- cascade on COMPOUNDS
    DELETE FROM CONTAINER_ITEM
    WHERE NOT EXISTS(
    SELECT 1
    FROM CONTAINER_CANDIDATES
    WHERE CONTAINER_ITEM.ID = CONTAINER_CANDIDATES.CONTAINERITEMID
    );

    -- remove ELEMENTS not used in COMPOUNDS
    DELETE FROM ELEMENTS
    WHERE NOT EXISTS(
    SELECT 1
    FROM COMPOUNDS
    WHERE ELEMENTS.ID = COMPOUNDS.ELEMENTSID
    );

    COMMIT;

    END;
    /

    这不确定您的任何表中都没有孤儿。它使用 Cascade 来完成大部分工作,只对两个从表中未使用的数据进行少量修剪。

    唯一的缺点是这将不允许您继续输入 CONTAINER_ITEMELEMENTS如果你不使用它们。

    关于sql - 更新数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42853283/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com