2

私はこれについてここで他の質問を見てきました。機能していません。

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `environment_admin`(
IN environment_id   TEXT,
IN user_id          TEXT,
IN username         VARCHAR(75),
IN password         VARCHAR(512)
)
BEGIN
DECLARE env_id INT;
DECLARE admin_id INT;

SET env_id = CAST(environment_id AS SIGNED INT);
SET admin_id = CAST(user_id AS SIGNED INT);

IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE environment_id = env_id AND user_id = admin_id) THEN
    BEGIN
    INSERT INTO 
        `environment`.`environment_accounts` 
        (
            `environment_id`, 
            `user_id`, 
            `username`, 
            `password`, 
            `is_active`, 
            `is_admin`, 
            `is_mod`
        ) 
        VALUES 
        (
            env_id, 
            admin_id,
            username,
            password,
            1,
            1,
            1
        );
    END;
END IF;
END

だから私が実行した場合:

CALL `environment`.`environment_admin`('22','1','kacieh','512c9ad228332bbd30d09ce7ffb8896e00a1610e914a5fa180bf15ce702b90423e6a9540579f672315ae3c6cb1b8d06ee2b784b4761e806675aa88c2a915553e');

0行が影響を受けましたが、確かに何も起こりませんでした。--- 私は条件付きクエリをテストしたこの時間に取り組んできました。ストアド プロシージャ内の挿入ステートメントだけをテストしましたが、同様に機能します。

4

2 に答える 2

5

そのようなことはやめてください。2 つの挿入が同時に実行されていると効率が悪く、さらに悪化する可能性があります。:)

使用 INSERT.... ON DUPLICATE KEY UPDATE ...こちらを参照

1つのトリックは、ON DUPLICATE KEY UPDATE environment_id = env_idを実行することです(列を変更しないため、何も更新されず、INSERTがエラー状態なしでは機能しないことが保証されます。その後、変更/挿入された行の数を確認できます)

于 2012-08-30T04:42:41.507 に答える
2

私はあなたがあなたの問題を解決したことを理解しています(特に同時実行性の問題を強調するために、Parallelisの回答に+1します)が、他の誰かに役立つ場合に備えて...

MySQL はおそらく、パラメータenvironment_idと列user_idおよび の間で混乱していました。つまり、に少なくとも 1 つの行がある限り、句は常に falseを返し、挿入は実行されません。environment_accountsenvironment_iduser_idWHEREenvironment_accountsNOT EXISTS

たとえば、パラメータenvironment_iduser_idパラメータの値がそれぞれ 1 と 2 の場合、NOT EXISTS句は次のように評価されます。

IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE 1 = 1 AND 2 = 2) THEN

パラメータのような接頭辞を追加するなど、パラメータ(およびその他の変数)の命名規則を持つ価値があるかもしれませんp_

于 2012-09-03T15:28:37.090 に答える