2010-08-30 46 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回答了你为什么得到错误的问题。我想知道为什么这两个表是分开的:它看起来像是一对一的关系,头和主体都应该在主表中。不这样做的唯一理由是如果有性能方面的考虑。