web-dev-qa-db-ja.com

相互参照するテーブルにデータを挿入する方法(MySQL)

私は学生ですが、今は自分で解決できない問題があります(インターネットで検索した後)。

自分のやっていることを学びたいので、「宿題」はしませんが、例を使用します。

次の図があります。 enter image description here

そして次のように:

従業員(ID、DepartamentID、Floor)
外部キー(DepartamentIDFloor)はDepartament(DepartamentID、Floor)を参照します

Departament(DepartamentIDFloor、アテンダント)
外部キーアテンダントは従業員(ID)を参照します


したがって、このガイドラインを使用すると、私の実際のSQLコードは次のようになります。

CREATE TABLE Employee(
    ID varchar(25) not null,
    DepartamentID varchar(25),
    Floor varchar(25),
    CONSTRAINT pk_ID PRIMARY KEY (ID),
) ENGINE=InnoDB;

CREATE TABLE Departament(
    DepartamentID varchar(25) not null,
    Floor varchar(25) not null,
    Attendant varchar(25) not null,
    CONSTRAINT pk_dept PRIMARY KEY (DepartamentID, Floor),
    CONSTRAINT fk_att FOREIGN KEY (Attendant) REFERENCES Employee (ID),
) ENGINE=InnoDB;

ALTER TABLE Employee
ADD CONSTRAINT fk_dept FOREIGN KEY (DepartamentID, Floor) REFERENCES Departament (DepartamentID, Floor);

このようにして、与えられた情報が言うように、私が達成しなければならないことを達成すると思いますbut次のようなデータを挿入しようとすると:

INSERT INTO Employee (ID, DepartamentID,Floor) VALUES ('123456789-Z', 'IT', 'roof');

または

INSERT INTO Departament (DepartamentID, Floor, Attendant) VALUES ('IT', 'roof', '123456789-Z');

次のメッセージが表示されます。

1452-子行を追加または更新できません:外部キー制約が失敗します

検索して検索したところ、別のテーブルからのデータが必要なテーブルにデータを挿入することはできず、別のテーブルが空であることに気付きました。

挿入の前にalter tableを実行できると思っていましたが、先生はcreate.sqlファイルとinserts.sqlファイルを別々に必要としているため、この方法では実行できません。

私はこれを達成するための解決策を見つける必要があり、stackexchangeは私の最後の希望です。

これを読んでくださった皆さん、ありがとうございました。

PD:質問が長すぎる場合は申し訳ありませんが、私はできる限り最善を尽くして説明しましたが(英語は母国語ではありません)、もう一度説明する必要がある場合は、説明します!

2
user47579

タスクが理解できたかどうかはわかりませんが、ここに代替スキーマを検討するための食べ物をいくつか示します。

CREATE TABLE Departament(
    DepartamentID varchar(25) not null,
    Floor varchar(25) not null,
        CONSTRAINT pk_dept PRIMARY KEY (DepartamentID, Floor),
) ENGINE=InnoDB;


CREATE TABLE Employee(
    ID varchar(25) not null,
    DepartamentID varchar(25),
    Floor varchar(25),
        CONSTRAINT pk_ID PRIMARY KEY (ID),
        CONSTRAINT fk_dept FOREIGN KEY (DepartamentID, Floor) 
            REFERENCES Departament (DepartamentID, Floor)
) ENGINE=InnoDB;

CREATE TABLE Attendant (
    ID varchar(25) not null,
    DepartamentID varchar(25) not null,
    Floor varchar(25) not null,

    CONSTRAINT pk_attendent PRIMARY KEY (ID),
    CONSTRAINT ak_attendent UNIQUE (DepartamentID, Floor),
    CONSTRAINT fk_... REFERENCES Employee ...,
    CONSTRAINT fk_... REFERENCES Department ...,
) ENGINE=InnoDB;
1
Lennart