2010-08-30 86 views
0

我有2個表1-> 1/1-> N在Oracle中的關係?

T_Foo 
foo_id 
fooHeader 

T_FooBodys 
foo_id 
foobody 

foo_id對於兩個它們各自的表的主鍵。在第二個表中,foo_id是第一個表的外鍵。我使用序列爲兩個表值生成PK,並嘗試插入 - 一次插入FooHeader,兩次插入FooBody。

從錯誤的第二個插入到循環t_FooBodys我的代碼崩潰 「ORA-00001:唯一約束(USERID.FooBodys_PK)違反」

所以我有2個問題:

1)什麼是MSSQL Server和Oracle的根本區別在哪裏?這在SQL Server中運行良好!我在那裏一直有一對一/多個關係

2)除了增加另一個鍵並基本結束共享主鍵概念之外,解決這個問題的最簡單方法是什麼?

感謝很多

回答

2

foo_id是兩者的 它們各自的表

主鍵不能有重複的條目與任何MS SQL Server或Oracle一個PK,讓你有什麼地方弄錯了。您可能已經在SQL Server中設置了FK關係,但您無法將T_FooBodys中的foo_id設置爲PK,並且它仍允許重複條目。

+0

* scratch head * ... hummm ..我想我在考慮1-> 1而不是1-> N與共享PK。 Duh ... * brainfart * – dferraro 2010-08-30 21:39:12

0

如果foo_id是在T_FooBodys表的主鍵,那麼它必須是唯一的。這聽起來像你希望foo_id是T_FooBodys中的外鍵。我認爲SQL Server具有相同的約束 - 主鍵必須是唯一的 - 這基本上是主鍵的定義。

你可以添加一個新的PK到Bodys表嗎?並將foo_id作爲Header表中的PK和Bodys表中的外鍵?

0
  1. 我不相信它的工作方式與您在MS SQL Server中描述的一樣。如果您在T_FooBodys.foo_id上有一個主鍵約束,那麼您只能插入一個具有給定值的行。

  2. 要使T_FooBodys對於給定值foo_id接受多行,您應該添加另一列並在該列上創建一個包含foo_id的兩列主鍵。這將允許您在第二列中有不同的值,保持唯一性。

    CREATE TABLE T_FooBodys (
        foo_id INTEGER NOT NULL, 
        foo_body_id INTEGER NOT NULL, 
        foobody TEXT, 
        PRIMARY KEY (foo_id, foo_body_id), 
        FOREIGN KEY (foo_id) REFERENCES T_Foo (foo_id) 
    ); 
    
0

回答指定問題,我會說:

  1. 我不知道MSSQL,但甲骨文是嚴格的外鍵和主鍵。要添加一些外鍵,您需要確保該ID已經存在於主表中。如果該主鍵不存在,您將獲得違反ORA-xxx約束。與外鍵類似,主鍵約束需要其值是唯一的。當某些不唯一的東西被插入爲主鍵時,您將得到ORA-xxx主鍵違例。我不確定MSSQL是否與Oracle一樣嚴格。但是在MySQL中,這種情況可以通過使用一些不太「嚴格」的引擎來避免(在外鍵約束中)。
  2. 要處理這個問題,你可以做幾件事情。首先,不要將主鍵和外鍵混合在同一個字段中。它有助於分開它們。每次插入時都要增加主鍵,並確保外鍵(在另一個字段中)不會破壞任何約束。其次,您可以通過僅使用一個字段來維護此「多功能字段」概念。但是,爲了做到這一點,您需要從該多功能字段中刪除主鍵約束。因此產生一個沒有主鍵的表格。我對此不太確定,因爲我無法再訪問Oracle數據庫。有人請確認這一點。
  3. 畢竟,使用1-1關係就像提供了證明你錯誤地設計了你的表結構。因爲,正如大家所知道的,1-1關係可以簡化爲單一表格。

希望它可以幫助

0

,則應該更換表T_FOOBODYS通過以下方式:

/*Create table*/ 
create table T_FOOBODYS 
( 
    FOOBODY_ID NUMBER(10) not null, 
    FOO_ID  NUMBER(10) not null, 
    FOOBODY VARCHAR2(512) 
); 

/* Create/Recreate primary, unique and foreign key constraints */ 
alter table FOOBODY 
    add constraint FBPK primary key (FOOBODY_ID) 
    ENABLE; 
alter table FOOBODY 
    add constraint FBFK foreign key (FOO_ID) 
    references T_FOO(FOO_ID); 

這裏,FOOBODY_ID代表你對你的T_FOOBODYS表的主鍵,FOO_ID是參照約束到T_FOO

0

RedFilter回答了你爲什麼得到錯誤的問題。我想知道爲什麼這兩個表是分開的:它看起來像是一對一的關係,頭和主體都應該在主表中。不這樣做的唯一理由是如果有性能方面的考慮。