他のテーブルのキーを参照するテーブルに行を挿入しようとしています。選択した値を null にすることはできないため、挿入/選択が失敗する場合があります。必要に応じて他のテーブルに必要な行を作成できるように、どの選択が失敗したかを知りたいです。
次の例は少し不自然ですが、ここでの課題を説明する必要があります。
CREATE TABLE TableOne
(
TableOneId INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(64) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE TableTwo
(
TableTwoId INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(64) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE DependentTable
(
DependentId INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
TableOneId INT UNSIGNED NOT NULL,
TableTwoId INT UNSIGNED NOT NULL,
Value FLOAT NOT NULL,
FOREIGN KEY (TableOneId) REFERENCES TableOne(TableOneId),
FOREIGN KEY (TableTwoId) REFERENCES TableOne(TableTwoId)
) ENGINE=InnoDB;
INSERT INTO DependentTable (Value, TableOneId, TableTwoId) SELECT 1.0, TableOne.TableOneId, TableTwo.TableTwoId FROM TableOne,TableTwo WHERE TableOne.Value='TableOneValue' AND TableTwo.Value='TableTwoValue';
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
「TableOneValue」または「TableTwoValue」のいずれかが存在しない場合、選択は null を返し、0 行が挿入されます - 期待どおりです。ただし、どの値が存在しないかを判断して作成できるようにする他の情報を取得したいと考えていました。
問題は、少なくとも私の実際の状況では、外部キー参照を満たすために各値をやみくもに作成すると、複数の外部キーがあり、それらの依存テーブルの一部には他の必要な依存関係があるため、やり過ぎ/高価になることです。もう少し賢くアプローチして、どの参照が存在しなかったかを判断し、代わりにそれらのみを作成したいと思います。
依存テーブルに行を 1 つずつ作成し、行が実際に挿入されるまで待ってから (重複したエントリを取得するのではなく)、元の挿入をもう一度試すことができます。これを行うエレガントな方法...
提案/アイデアをお寄せいただきありがとうございます...