5

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

Empleados(**numEmpl**, nombre, apellido, sexo, telefono, salario, numDept)
Departamentos(**numDept**, nombreDept, numDirect)

部門:

  1. numEmpl は主キーです
  2. numDept は、Departamentos(numDept) への外部キー参照です。部門:
  3. numDept は主キーです
  4. numDirect は Empleados (numEmpl) への外部キー参照です。

したがって、循環参照があります。

まず、テーブルを作成しました。

CREATE TABLE EMPLEADOS(numEmpl primary key, nombre, 
     apellido, sexo, telefono, salario, numDept)
CREATE TABLE DEPARTAMENTOS(numDept primary key, nombreDept, numDirect)
(i didn't write here each of type is each colum)

次に、それらの間の参照を作成します。

ALTER TABLE DEPARTAMENTOS 
    ADD CONSTRAINT FK_DEPT_EMP FOREIGN KEY (numDirect) 
    REFERENCES EMPLEADOS(numEmpl)
ALTER TABLE EMPLEADOS 
    ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY (numDept) 
    REFERENCES DEPARTAMENTOS(numDept).

うまくいったので、いくつかのデータを挿入しようとしました:

INSERT INTO Empleados(numEmpl, nombre, apellidos, sexo, telefono, salario, numDept)
VALUES (1, 'Pepito', 'Pérez', 'H', '111111111', 20000, 1);
INSERT INTO Departamentos(numDept, nombreDept, numDirect)
VALUES (1, 'Direccion', 1);

しかし、循環参照にデータを導入できないというエラーが表示されます。循環参照を無効にしてデータを挿入し、再度有効にしようとしましたが、うまくいきましたが、そうではないと言われました正しい方法で、そのようにデータを挿入するためにテーブルを作成している間に何か特別なことをしなければなりませんが、それはうまくいきますが、その方法がわかりません。ちなみに、私はオラクルのSQL開発者を使用しています。

編集:回答ありがとうございますが、うまくいきませんでした。まず第一に、私はそのテーブルしか持つことができず、挿入を行うときは、パラメータをnullにしてから更新せずに、そのように機能しなければなりません. だから私がしなければならない唯一の方法は、サークル参照を許可することですが、誰かがここで言った方法でそれをやろうとすると、ロールバックについて何かがわかります。誰かが助けてくれますか?

4

4 に答える 4

6

循環参照を許可するには、遅延可能な制約が必要です。

ALTER TABLE DEPARTAMENTOS 
    ADD CONSTRAINT FK_DEPT_EMP FOREIGN KEY (numDirect) 
    REFERENCES EMPLEADOS(numEmpl)
    DEFERRABLE INITIALLY DEFERRED
    ;
ALTER TABLE EMPLEADOS 
    ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY (numDept) 
    REFERENCES DEPARTAMENTOS(numDept)
    DEFERRABLE INITIALLY DEFERRED
    ;

据え置き可能制約は、トランザクションの最後にチェックされます。コミット時間の前に、誤った無効なデータベース状態が存在することが許可されます (元の質問: 2 つの挿入ステートメントの間)。ただし、ステートメントはトランザクション内にある必要があるため、ステートメントを と で囲む必要がBEGIN [WORK];ありCOMMIT [WORK];ます。

于 2013-04-14T14:16:37.233 に答える
0

循環参照は危険であり、一貫性のない状態にならないように、データに戻って更新する必要があります。

まだ計画段階にある場合は、これを回避するために他のオプションを検討することをお勧めします。そうしないと、後で多くの頭痛の種に遭遇する可能性があります.

http://blogs.msdn.com/b/sqlazure/archive/2010/07/01/10033575.aspx

それでも使用したい場合は、部門テーブルで許可された値として NULL を設定することをお勧めします (これにより、d なしで新しい値を挿入できます)。従業員を挿入し、戻って従業員で更新します。 ID。

于 2013-04-14T14:19:10.737 に答える
-1

departmentos テーブルから numDirect 列を取り出します。そのテーブルは、単に部門を説明する必要があります。ビジネス ルールに応じて、departamentos と Empleados の間に 1 対多の関係が必要になるか、それらの間に多対多の関係が必要になります。Empleado が複数の部門で機能する場合は、Empleados テーブルから numDept 列を削除し、別のテーブルを作成して多対多の関係を設定します。

現在のデザインでレコードを追加する方法を見つけた場合、より大きな問題が発生します。部門ごとに 1 つのレコードだけではなく、Empleado ごとに 1 つのレコードが必要になります。

于 2013-04-14T14:11:30.023 に答える