0

私は2つのテーブルを持っています

T_Foo
foo_id
fooHeader

T_FooBodys
foo_id
foobody

foo_id は、それぞれのテーブルの両方の主キーです。2 番目のテーブルの foo_id は、最初のテーブルへの外部キーです。シーケンスを使用して両方のテーブル値の PK を生成し、挿入を試みます。1 回は FooHeader に、2 回は FooBody に挿入します。

私のコードは、エラー「ORA-00001: 一意の制約 (USERID.FooBodys_PK) に違反しています」からのループで t_FooBodys への 2 番目の挿入でクラッシュします。

だから私は2つの質問があります:

1) MSSQL Server と Oracle の根本的な違いは何ですか? これはSQL Serverでうまくいきました!私はそこに常に1対1/多の関係を持っていました

2) 別のキーを追加して基本的に共有主キーの概念を終了する以外に、これを修正する最も簡単な方法は何ですか?

どうもありがとう

4

6 に答える 6

2

foo_idは、それぞれのテーブルの両方の主キーです。

MS SQL ServerまたはOracleのいずれかでPKのエントリを重複させることはできないため、どこかで間違いを犯しました。SQL ServerでFK関係を設定した可能性がありますが、PKとして設定foo_idする方法はなくT_FooBodys、重複したエントリが許可されます。

于 2010-08-30T21:32:15.817 に答える
0

foo_idがT_FooBodysテーブルの主キーである場合、それは一意である必要があります。foo_idをT_FooBodysの外部キーにしたいようです。SQL Serverにも同じ制約があると思います。つまり、主キーは一意である必要があります。これが基本的に主キーの定義です。

Bodysテーブルに新しいPKを追加できますか?そして、foo_idをHeaderテーブルのPKとして、Bodysテーブルの外部キーとして残しますか?

于 2010-08-30T21:31:11.790 に答える
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_FOOBODYSFOO_IDT_FOO

于 2010-08-31T02:31:18.757 に答える
0

与えられた問題に答えるために私は言うでしょう:

  1. MSSQLについてはわかりませんが、Oracleは外部キーと主キーに厳密です。外部キーを追加するには、そのIDがプライマリテーブルにすでに存在することを確認する必要があります。その主キーが存在しない場合は、ORA-xxx制約違反が発生します。外部キーと同様に、主キー制約はその値が一意である必要があります。一意ではないものが主キーとして挿入されると、ORA-xxx主キーに違反します。MSSQLがOracleと同じくらい厳格かどうかはわかりません。しかし、MySQLでは、この種の状況は、(外部キー制約で)「厳密すぎない」エンジンを使用することで回避できます。
  2. これを処理するために、いくつかのことができます。まず、同じフィールドに主キーと外部キーを混在させないでください。それらを分離するときに役立ちます。挿入するたびに主キーを増やし、(別のフィールドの)外部キーが制約を壊さないことを確認してください。次に、1つのフィールドのみを使用して、この「多機能フィールド」の概念を維持できます。ただし、これを行うには、この多機能フィールドから主キー制約を削除する必要があります。したがって、主キーのないテーブルを作成します。Oracleデータベースにアクセスできなくなったため、これについてはよくわかりません。誰かがこれを確認してください。
  3. 結局のところ、1-1の関係を使用することは、テーブル構造を誤って設計したという証拠を提供するようなものです。ご存知かもしれませんが、1-1の関係は1つのテーブルに簡略化できるからです。

それが役に立てば幸い

于 2010-08-30T22:13:58.143 に答える
0

RedFilterは、なぜエラーが発生するのかという質問に答えました。なぜ2つのテーブルが分離しているのか疑問に思います。1対1の関係があるように見え、ヘッダーと本文の両方がメインテーブルにある必要があります。これを行わない唯一の理由は、パフォーマンスを考慮した場合です。

于 2010-09-02T17:02:20.253 に答える
0
  1. MSSQLServerで説明したように機能したとは思いません。に主キー制約がある場合T_FooBodys.foo_id、指定された値で1つの行のみを挿入できます。

  2. T_FooBodysの特定の値に対して複数の行を受け入れるようにするには、別の列を追加し、その新しい列でfoo_id2列の主キーを作成する必要があります。foo_idこれにより、2番目の列に個別の値を設定して、一意性を維持できます。

    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)
    );
    
于 2010-08-30T21:37:38.120 に答える