我希望这项工作
当UserAccount表重复时,Out Parameter put -1
当UserInfo表重复时,Out Parameter put -2。
当所有工作都成功时,Out Parameter会输入LAST_INSERT_ID。
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 :(得分:0)
从您的触发器判断,您不希望在数据库中有重复的键,因为您在找到插入时绕过了插入。
因此,您所要做的就是在第一个表中正确设置您的唯一索引,这样就可以为您完成这项工作,并在您的应用程序中生成一个显示。 请执行以下操作:
ALTER TABLE `UserAccount` ADD UNIQUE `UserAccount`(`socialType`, `socialID`);
由于您的数据似乎是1比1,因此id将所有这些放在同一个表中,然后您就不需要触发器了。