SQLのINSERT文は、1つの表にのみ挿入でき、その1つの表の列のみをリストできます。 source
列は、alias
表の列ではないため、INSERT文に含めることはできません。
トリガーを使用すると、セカンダリテーブルに挿入することができますが、トリガーは挿入する値を知る必要があります。この場合、トリガーにはsource
の値を取得する方法がありません。
これは、2つのINSERT文ではるかに簡単な作業です。
INSERT IGNORE INTO alias SET author_id = ?, alias = ?;
INSERT INTO alias_source ...
しかし、あなたのalias
表が自動インクリメント列id
を持っているので、あなたが問題を持っていますが、この列がキーの一部ではありません。 InnoDBでは、自動増分カラムをキーの最初のカラムにする必要があります。
alias_source
テーブルには、alias(id)
を参照する外部キーがありますが、これは許可されていません。外部キーは、親テーブルのキーを参照する必要があります。一意キーまたは主キーを参照し、キーのすべての列を参照する必要があります(そうでなければ、親テーブル内の複数の行を参照する可能性のある子テーブル内の行が得られ、意味をなさない)。
alias
テーブルに自動インクリメント列を使用する場合は、プライマリキーにして、他の列に2次UNIQUE制約を設定します。
CREATE TABLE alias (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
authors_id INT NOT NULL,
alias VARCHAR(150) NOT NULL,
UNIQUE KEY (author_id,alias));
次に、挿入後にid
を照会してください。新しい行を挿入した場合でも行が既に存在していても、選択した著者とエイリアスを持つ行にはid
が表示されます。あなたのコメントでフォローアップの質問を再
INSERT IGNORE INTO alias SET author_id = ?, alias = ?;
SELECT id FROM alias WHERE author_id = ? AND alias = ? INTO @id;
INSERT INTO alias_source SET alias_id = @id, source = ?;
:
良いアイデアが、それはあなたがそれがないと思うかもしれように動作しません。 id=id
のダミーセットを実行し、セッション変数を副作用として設定することができます。
mysql> insert into alias set author_id=1, alias='alias'
on duplicate key update id = @id:=id;
mysql> select @id;
+------+
| @id |
+------+
| NULL |
+------+
なぜ、セッション変数をIDに設定しなかったのですか?この挿入物はではなく、で重複していたため、新しい行でした。したがって、id
の値は、IODKUが実行された時点で自動インクリメントによってまだ生成されていませんでした。
あなたはその後が重複していることを行に対して同じIODKUを行う場合は、副作用の値を取得するので、id
値は以前、行に追加されました:
mysql> insert into alias set author_id=1, alias='alias'
on duplicate key update id = @id:=id;
mysql> select @id;
+------+
| @id |
+------+
| 1 |
+------+
とにかく@id
がNULLかどうかを確認するにはアプリケーションコードを書かなければならず、@id
がNULLの場合はSELECT id
というクエリを実行する必要があります。
これは、上記のようにINSERT IGNORE
の後に標準アクションとしてSELECT id
を実行するだけでは複雑に思えます。
回答ありがとう@ bill!しかし、ON DUPLICATE KEYを使用して重複IDを@idに格納することは可能ですか? 2番目のステートメントをスキップするには? –