3

関数を作成しようとしています

CREATE FUNCTION `func`(param1 INT, param2 INT, param3 TEXT) RETURNS int(11)
BEGIN
INSERT INTO `table1` (`column1`, `column2`, `column3` ) 
VALUES (param1, param2, param3)
ON DUPLICATE KEY 
UPDATE `time_stamp` = UNIX_TIMESTAMP();
RETURN last_insert_id();
END

これにより、テーブルに行が存在しない場合は行が挿入されますが、そうでない場合は更新されます。last_insert_id()関数が挿入された場合に正しいものを返したことに注意してください。それ以外の場合は、更新された場合に予測できません。

これを解決する別の方法は、SELECTS存在する場合は個別に識別して使用することです。id存在する場合は、それをupdate使用して取得しidます。それ以外の場合は、プレーンを実行しますINSERT

今私の質問:私が今しているsqlこととは対照的に、2つのステートメントを行うことに代わるものはありますか?

編集1

補遺:

自動インクリメント インデックスがあります。挿入する値はすべて一意です

別のテーブルで参照されているため、インデックスを変更したくない..

4

2 に答える 2

6

テーブルにAUTO_INCREMENT列が含まれていINSERT ... UPDATEて、行を挿入する場合、LAST_INSERT_ID()関数は値を返しAUTO_INCREMENTます。ステートメントが代わりに行を更新する場合、意味LAST_INSERT_ID()がありません。ただし、 を使用してこれを回避できます。それが列だとします。更新を意味のあるものにするために、次のように行を挿入します。LAST_INSERT_ID(expr)idAUTO_INCREMENTLAST_INSERT_ID()

INSERT INTO table (a, b, c) VALUES (1, 2, 3)
  ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id), c = 3;

このリンクで見つけました。試したことはありませんが、参考になるかもしれません。

編集1

REPLACEをチェックしてみてください:

REPLACE INTO table1 (column1, column2, column3) VALUES (param1, param2, param3);

PRIMARY KEYこれは、正しい/を持つテーブルで機能するはずUNIQUE INDEXです。

最後に、あなたはただ固執する必要があります:

IF (VALUES EXISTS ON TABLE ...)
    UPDATE ...
    SELECT Id;
ELSE
    INSERT ...
    RETURN last_insert_id();
END IF
于 2012-11-29T10:41:26.083 に答える