簡體   English   中英

在Oracle中,當所有需要的表都具有外鍵和主鍵約束時,我將如何開始創建表?

[英]In Oracle, how would I begin to create the tables when all the needed tables have both foreign and primary key constraint?

在Oracle中,可以說有3個表,每個表上都有主鍵和外鍵。 因此,如果我要開始創建表,我將如何開始。 我開始創建具有主鍵和外鍵的第一個表,但是當提到外鍵而不創建其他引用表時,不允許我創建表。 如果是這種情況,我將無法創建任何該表,因為我在所有3個表上都是外鍵,而在每個表上都是主鍵。 注意:是的,我知道以后可以添加約束。 但是我很好奇,在現實世界中編程如何解決這類問題。 開發人員稍后添加外部約束還是ummmm感到好奇。

您可以將外鍵約束聲明為DEFERRABLE ,這使您可以讓Oracle在事務結束時檢查約束。

SET TRANSACTION;
    SET CONSTRAINTS ALL DEFERRED;
    INSERT INTO TABLE_ONE (PK1, FK2, NAME)
        VALUES(10, 20, 'Foo');
    INSERT INTO TABLE_TWO (PK2, FK3, NAME)
        VALUES(20, 30, 'Bar');
    INSERT INTO TABLE_THREE (PK3, FK1, NAME)
        VALUES(30, 10, 'Baz');
COMMIT;

在前兩個INSERT的每一個之后,都有一個沒有引用的外鍵,但是Oracle直到提交才進行檢查。 第三次插入后,所有內容均已修復。

您是否想要這種數據結構?

“讓我們說有3個表,每個表上都有主鍵和外鍵。”

在現實世界中,這不可能發生。 必須至少有一個表,該表對任何其他表都沒有外鍵依賴性。

實際上,它可能比這更復雜。 大多數數據模型都有兩種表:查找(或代碼)表和業務數據表。 必須至少有一個不依賴於任何其他業務數據表的業務數據表,該數據表位於樹的頂部。

“開發人員稍后添加外部約束嗎?”

這取決於。 通常來說,為不同種類的DDL創建單獨的腳本很有用,因此,是的,通常是一次創建表,另一遍建立索引,然后添加約束。 如果數據庫階段包括數據加載,則這種策略將是適當的。

但是,如果提供的數據庫為空(除了查找數據外),則可以在單一腳本中構建表。 在這種情況下,我們需要對腳本進行排序,以便我們首先構建不具有外鍵依賴項的表,然后構建其子級,再構建其孫級,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM