0

他のテーブルのキーを参照するテーブルに行を挿入しようとしています。選択した値を 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 つずつ作成し、行が実際に挿入されるまで待ってから (重複したエントリを取得するのではなく)、元の挿入をもう一度試すことができます。これを行うエレガントな方法...

提案/アイデアをお寄せいただきありがとうございます...

4

1 に答える 1

0

私がすることは、外部キーなしですべてを中間テーブルに挿入することです。次に、そのテーブルを使用してTableOneとTableTwoに対してクエリを実行し、TableOneIdとTableTwoIdのどのアイテムがTableOneとTableTwoに存在しないかを確認します。次に、調整、クリーンアップなどを行います。

INSERT INTO IntermediateTable(DependentId, TableOneId, TableTwoId, Value) blah blah blah

以下に、欠落している値を示します(TableTwoについて繰り返します)。

SELECT * FROM IntermediateTable i LEFT JOIN TableOne t1 ON t1.TableOneid = i.TableOneId WHERE t1.TableOneId IS NULL

クリーンアップが完了すると、外部キーが定義された状態で、中間テーブルからDependentTableにすべてをコピーできます。

INSERT INTO DependentTable SELECT * FROM IntermediateTable--TableOneとTableTwoにIDが欠落していないように、すべてがクリーンアップされました。

この中間テーブルがないと、未定義のIDに対するTableOneおよびTableTwoに対するクエリに使用できるものがありません。

于 2013-01-07T05:04:57.660 に答える