2

私はMySqlの初心者です。次の自己参照テーブルを作成したいと思います。

EMPLOYEE
+-----+------+------+
|Name |E-ID  |M-ID  |
+-----+------+------+
|ABC  |12345 |67890 |
|DEF  |67890 |12345 |
+-----+------+------+

次のコマンドを使用します。

CREATE TABLE EMPLOYEE (
    NAME VARCHAR(20) ,
    E-ID CHAR(6) NOT NULL ,
    M-ID CHAR(6) NULL ,
    PRIMARY KEY (E-ID) ,
    FOREIGN KEY (M-ID) REFERENCES EMPLOYEE(E-ID)
    );

今私の問題は、2つのレコードをどのように入力するのですか?つまり、外部制約が失敗するたびに。入力してみました:

INSERT INTO EMPLOYEE VALUES('12345','67890');

私も試しました:

INSERT INTO EMPLOYEE VALUES('12345','67890'),('67890','12345');

上記のコマンドは両方とも失敗します。エラーを与える:

エラー1452(23000):子行を追加または更新できません:外部キー制約が失敗しますBLAH BLAH

皆さん、実際、私は次のpptのスライド番号25に示されているテーブルを実装しようとしていました:リレーショナルデータモデルとリレーショナルデータベースの制約

制約は次のとおりです。

  1. SUPERSSN Of EMPLOYEEは、EMPLOYEEのSSNを参照します。
  2. DEPARTMENTのMGRSSNは、EMPLOYEEのSSNを参照します。
  3. EMPLOYEEEのDNOは、DEPARTMENTのDNumberを参照します。

テーブルを作成した後、レコードを追加するにはどうすればよいですか?外部キー制約は常に失敗します。

4

3 に答える 3

4

MySQLは延期可能な制約(このような問題の「自然な解決策」)をサポートしていないため、これを2つのステップで行う必要があります。

INSERT INTO employee (name, `E-ID`) values ('Arthur', '123456');
INSERT INTO employee (name, `E-ID`) values ('Ford', '67890');
UPDATE employee 
    SET `M-ID` = '67890' 
WHERE `E-ID` = '123456';

UPDATE employee 
    SET `M-ID` = '123456' 
WHERE `E-ID` = '67890';

しかし、循環参照は私には奇妙に聞こえます。ある従業員が上司である従業員の管理者ですか?

テーブル定義について2つのコメントを許可してください。

  • 引用符で囲まれた識別子を必要とする特殊文字を含む列(またはテーブル名)は避けてください。E_IDの代わりに使用するE-IDと、長期的には問題を回避できます
  • 従業員IDが、データ型で値が埋め込まれているためではVARCHAR(6)なく、おそらく使用したい文字よりも6文字短くなる可能性がある場合。CHAR(6)CHAR
于 2012-09-19T07:24:18.583 に答える
2

ここには良い答えがありますが、私がすぐに汚いことを指摘すると思いました:

SET FOREIGN_KEY_CHECKS = 0; 
INSERT INTO EMPLOYEE VALUES('12345','67890'),('67890','12345');
SET FOREIGN_KEY_CHECKS = 1;
于 2015-12-02T01:59:07.223 に答える
1

テーブルが空であるため、明らかに失敗します。

INSERT INTO EMPLOYEE VALUES('12345','67890');

M-IDに依存するのでE-ID。レコードを挿入できるように、制約を削除します。あなたがする最善のことは、別のテーブルを作成しM-ID、それをテーブルに参照することEmployeeです。

于 2012-09-19T07:17:48.873 に答える