2016-05-29 13 views
0

私はこの仕事を望んでいます。
UserAccountテーブルが重複した場合、出力パラメータは-1を設定します。
UserInfoテーブルが重複している場合、Outパラメーターは-2となります。
すべての作業が成功すると、Out ParameterはLAST_INSERT_IDを挿入します。
Mysql重複するキーチェックで複数のテーブルを挿入するにはどうすればよいですか?

UserAccountの表

CREATE TABLE UserAccount (
    SocialType ENUM('Google', 'Facebook'), 
    SocialID BINARY(16), 
    UserID INT UNIQUE NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY(SocialType, SocialID) 
); 

UserInfoテーブル

CREATE TABLE UserInfo (
    UserID INT, 
    Nickname VARCHAR(20) UNIQUE, 

    PRIMARY KEY(UserID), 
    FOREIGN KEY(UserID) REFERENCES UserAccount(UserID) 
    ON DELETE CASCADE, 
); 

私は、プロシージャ内の重複チェックにテーブルを挿入したいです。
しかし、それはうまく動作せず、効率が悪いようです。

DELIMITER $$ 
CREATE PROCEDURE usp_CreateNewUser(
    socialType ENUM('Google','Facebook'), 
    socialID VARCHAR(100), 
    nickname VARCHAR(20), 
    OUT result INT) 
Work:BEGIN 
    IF EXISTS(SELECT 1 FROM UserAccount WHERE SocialType = socialType AND SocialID = UNHEX(MD5(socialID))) 
    THEN 
     SET result = -1; 
     Leave Work; 
    END IF; 

    IF EXISTS(SELECT 1 FROM UserInfo WHERE Nickname = nickname) 
    THEN 
     SET result = -2; 
     Leave Work; 
    END IF; 

    INSERT INTO UserAccount() VALUE(socialType, UNHEX(MD5(socialID)), 0); 
    INSERT INTO UserInfo(UserID, Nickname) VALUE(LAST_INSERT_ID(), nickname); 
    SET result = LAST_INSERT_ID(); 
END $$ 
DELIMITER ; 

この状況で私ができることは何ですか?
ありがとうございます。

+0

重複行のトリガーですか? – sagi

答えて

0

トリガから判断すると、データベースに重複したキーが存在しないようにするために、挿入をバイパスしているので、そのキーを持つことは望ましくありません。

あなたがしなければならないことは、最初のテーブルに独自のインデックスが正しく設定されていることです。それがその作業を行い、アプリケーションにディスプレイを生成します。 は以下の操作を行います。あなたのデータが1対1であるように思われるので

ALTER TABLE `UserAccount` ADD UNIQUE `UserAccount`(`socialType`, `socialID`); 

を、idが同じテーブルにこのすべてを入れて、あなたはトリガーを必要としないでしょう。

関連する問題