2016-05-29 84 views
0

我希望这项工作。
当UserAccount表重复时,Out参数放置-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

从您的触发器判断,您不希望在数据库中有重复的键,因为当您找到某个键​​时您会绕过插入。

因此,您所要做的就是在第一个表格中正确设置您的唯一索引,这些索引将为您工作,并在应用程序中生成显示。 做如下:

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

由于您的数据似乎是1比1,ID把所有这一切都在同一个表,然后你就不需要触发。