1

4 つのテーブルに値を挿入するストアド プロシージャを作成しています。要点は、SQL インジェクションを防ぎINSERT、ユーザーが持っているパーミッションをより適切に定義するために PHP から SQLSELECTを取り除くことです。渡された変数。ALTERDELETE

ただし、プレーヤーが既に存在する場合は、再度追加する必要はありません (独自に作成したことを考えると不可能です)。この問題は、プレイヤー テーブルと座標テーブルの間に 1 対多の関係があるために発生します。

だから私が望むのはINSERT、値がすでに存在するかどうかをテストする条件と、次のINSERTステートメントに移動するかどうかです。

ストアド プロシージャは次のとおりです。

CREATE PROCEDURE `acdb_extended`.`addAlliedMember` (IN accountNumber VARCHAR(255),
    IN userName VARCHAR(255), IN serverInitial CHAR(1), IN galaxy TINYINT(2),
    IN region TINYINT(2), IN system TINYINT(2), IN astro TINYINT(2), IN level TINYINT(2),
    IN allianceName VARCHAR(255))
BEGIN
    INSERT INTO player (account_number, username)
    VALUES (accountNumber, userName);

    INSERT INTO coordinates (player_ID, server_initial, galaxy, region, system, astro)
    VALUES ((SELECT player_ID FROM player WHERE username = userName), serverInitial,
        galaxy, region, system, astro);

    INSERT INTO jumpgate (player_ID, coordinates_ID, level, usable)
    VALUES ((SELECT player_ID FROM player WHERE username = userName),
        (SELECT c.coordinates_ID FROM coordinates c WHERE c.server_initial = serverInitial
            AND c.galaxy = galaxy AND c.region = region AND c.system = system AND c.astro = astro),
        level, FALSE);

    INSERT INTO relationship (player_ID, ally, alliance_name)
    VALUES ((SELECT player_ID FROM player WHERE username = userName),
        TRUE, allianceName);
END

必要だと思いますON DUPLICATE KEYが、その使い方がよくわかりません。

すべての助けを前もって感謝します。

4

2 に答える 2

1

MySQLでこれを行うにはいくつかの方法があります。簡単な解決策は、INSERT IGNOREの代わりにを使用することですINSERT。新しい行がテーブル内の既存の値UNIQUE INDEXまたは値と重複する場合、前者は基本的に何もしません。詳細については、 INSERT構文PRIMARY KEYに関するMySQLのドキュメントを参照してください。

INSERT INTO ... SELECT ...より柔軟性のある構文を使用することもできます。簡単な例を見てみましょう。次のステートメントは基本的に同じことを行います。

INSERT INTO foobar (foobar_id,display_name) VALUES (1,'one');

INSERT INTO foobar (foobar_id,display_name)
    SELECT 1,'one' FROM dual;

SELECTfoob​​arで重複エントリを検出するようにクエリを変更すると、目的の動作が得られます。詳細については、 INSERT...SELECT構文に関するMySQLのドキュメントを参照してください。

編集:これは、ストアドプロシージャ内で、ストアドプロシージャのパラメータを使用して機能します。

CREATE PROCEDURE sp_foobar(IN _foobar_id int, IN _display_name varchar(255))
BEGIN
    INSERT INTO foobar (foobar_id, display_name)
        SELECT _foobar_id, _display_name
        FROM dual;
END;
于 2012-04-06T14:13:30.983 に答える
0

多分このようにすることはできません:

IF NOT EXISTS(SELECT NULL FROM player WHERE account_number=accountNumber AND username=userName)
BEGIN
  INSERT INTO player (account_number, username)
  VALUES (accountNumber, userName);

  INSERT INTO coordinates (player_ID, server_initial, galaxy, region, system, astro)
  VALUES ((SELECT player_ID FROM player WHERE username = userName), serverInitial,
      galaxy, region, system, astro);
END
于 2012-04-06T13:45:56.470 に答える