【问题标题】:1->1/1->N relationship in Oracle?Oracle中的1->1/1->N关系?
【发布时间】:2010-08-30 21:27:20
【问题描述】:

我有两张桌子

T_Foo
foo_id
fooHeader

T_FooBodys
foo_id
foobody

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

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

所以我有两个问题:

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

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

非常感谢

【问题讨论】:

    标签: sql oracle unique-constraint ora-00001


    【解决方案1】:

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

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

    【讨论】:

    • scratch head... 嗯.. 我想我想的是 1->1 而不是 1->N 共享 PK。呃... brainfart
    【解决方案2】:

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

    你能在 Bodys 表中添加一个新的 PK 吗?并将 foo_id 保留为 Header 表中的 PK 和 Bodys 表中的外键?

    【讨论】:

      【解决方案3】:
      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)
        );
        

      【讨论】:

        【解决方案4】:

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

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

        希望对你有帮助

        【讨论】:

          【解决方案5】:

          您应该按以下方式更改表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 的引用约束。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-15
              • 1970-01-01
              相关资源
              最近更新 更多