2016-05-29 11 views
0

Ich hoffe auf diese Arbeit.
Wenn UserAccount-Tabelle dupliziert wurde, Out-Parameter -1 eingeben.
Wenn die UserInfo-Tabelle dupliziert wurde, setzen Sie den Parameter -2.
Wenn alle Arbeit erfolgreich ausgeführt wurde, setzen Sie Out Parameter LAST_INSERT_ID.
Mysql Wie füge ich mehrere Tabelle mit doppelten Schlüsselprüfung ein?

Useraccount Tabelle

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

    PRIMARY KEY(SocialType, SocialID) 
); 

Userinfo Tabelle

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

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

I Tabellen einfügen wollen mit zweifacher Ausfertigung in Verfahren zu überprüfen.
Aber es funktioniert nicht und scheint ineffizient.

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 ; 

Was ist der beste Weg, den ich in dieser Situation tun kann?
Danke.

+0

Ein Trigger für doppelte Zeilen? – sagi

Antwort

0

Wenn Sie von Ihrem Auslöser ausgehen, möchten Sie keine doppelten Schlüssel in Ihrer Datenbank haben, da Sie den Einsatz umgehen, wenn Sie einen finden.

Alles, was Sie tun müssen, ist, dass Ihre eindeutigen Indizes in Ihrer ersten Tabelle korrekt eingerichtet sind, was für Sie funktioniert und eine Anzeige in Ihrer Anwendung erzeugt. Sie die folgenden:

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

Da Ihre Daten 1 bis 1 zu sein scheint, id all dies in der gleichen Tisch legen, und dann würden Sie nicht den Auslöser benötigen.

Verwandte Themen