Oracle中的1> 1 / 1-> N关系?

时间:2010-08-30 21:27:20

标签: sql oracle unique-constraint ora-00001

我有2张桌子

T_Foo
foo_id
fooHeader

T_FooBodys
foo_id
foobody

foo_id是两个表的主键。在第二个表中,foo_id是第一个表的外键。我使用一个序列生成两个表值的PK,并尝试插入 - 一次进入FooHeader,两次进入FooBody。

我的代码在第二次插入到T_FooBodys的循环中崩溃,错误为“ORA-00001:违反了唯一约束(USERID.FooBodys_PK)”

所以我有两个问题:

1)MSSQL Server和Oracle之间的根本区别是什么?这在SQL Server中运行良好!我一直有一对一/很多关系

2)除了添加另一个密钥并基本上结束共享主键概念之外,解决此问题的最简单方法是什么?

非常感谢

6 个答案:

答案 0 :(得分:2)

  

foo_id是两者的主键   各自的表格

对于具有MS SQL Server或Oracle的PK,您不能有重复的条目,因此您在某处犯了错误。您可能已在SQL Server中设置了FK关系,但无法将foo_id中的T_FooBodys设置为PK,并且仍允许重复输入。

答案 1 :(得分:0)

如果foo_id是T_FooBodys表中的主键,则它必须是唯一的。听起来你希望foo_id成为T_FooBodys中的外键。我认为SQL Server具有相同的约束 - 主键必须是唯一的 - 这基本上是主键的定义。

您可以在Bodys表中添加新的PK吗?并将foo_id保留为Header表中的PK和Bodys表中的外键?

答案 2 :(得分: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)
    );
    

答案 3 :(得分:0)

为了回答给定的问题,我会说:

  1. 我不了解MSSQL,但Oracle对外键和主键严格。要添加一些外键,您需要确保该ID已存在于主表中。如果该主键不存在,则会违反ORA-xxx约束。与外键类似,主键约束需要其值是唯一的。当某些不唯一的东西作为主键插入时,您将获得ORA-xxx主键违规。我不确定MSSQL是否和Oracle一样严格。但是在MySQL中,通过使用一些不太“严格”的引擎(在外键约束中)可以避免这种情况。
  2. 要处理这个问题,你可以做几件事。首先,不要在同一个字段中混合主键和外键。当你分开它们时它会有所帮助。只需在每次插入时让主键增加,并确保外键(在另一个字段中)不会破坏任何约束。其次,您只需使用一个字段即可维护此“多功能字段”概念。但是,为了做到这一点,您需要从此多功能字段中删除主键约束。因此产生一个没有主键的表。我不太确定这一点,因为我再也无法访问Oracle数据库了。有人请确认一下。
  3. 毕竟,使用1-1关系就像提供错误设计表结构的证明一样。因为,正如大家所知,1-1关系可以简化为单表。
  4. 希望有所帮助

答案 4 :(得分: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_IDT_FOO的参考约束。

答案 5 :(得分:0)

RedFilter回答了为什么你收到错误的问题。我想知道为什么这两个表是分开的:它看起来像是一对一的关系,并且标题和正文都应该在主表中。不这样做的唯一原因是如果有性能考虑。