【问题标题】:Mysql How do I insert multiple table with duplicate key checking?Mysql如何插入具有重复键检查的多个表?
【发布时间】:2016-09-27 06:28:57
【问题描述】:

我希望这项工作。
当 UserAccount 表重复时,Out Parameter 放-1。
当 UserInfo 表重复时,Out Parameter put -2.
当所有工作都成功后,Out Parameter 放入 LAST_INSERT_ID。

用户帐户表

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

    PRIMARY KEY(SocialType, SocialID)
);

用户信息表

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 ;

在这种情况下我能做的最好的方法是什么?
谢谢。

【问题讨论】:

  • 重复行上的触发器?

标签: mysql insert duplicates primary-key unique-key


【解决方案1】:

从您的触发器来看,您不希望数据库中有重复的键,因为您在找到一个时会绕过插入。

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

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

由于您的数据似乎是 1 比 1,所以 id 将所有这些都放在同一个表中,然后您就不需要触发器了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2017-01-12
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多