【问题标题】:mysql: how put two columns unique in two tables at oncemysql:如何一次在两个表中放置两个唯一的列
【发布时间】:2024-01-21 08:52:01
【问题描述】:

在 MySQL 中,我想将两个(唯一)字段放在两个不同的表中,在我的示例中,我有三个表,登录表、教授和用户。我希望字段(id_user)和字段(id_prof)不要重复,以便在字段(num)的登录表中(唯一)之后插入它们 例如:id_user 1、3、6 ... id_prof: 2, 4, 5, 7 ... 数量:1,2,3,4,5,6,7...

【问题讨论】:

  • 您可以尝试在 nsert 之前触发并获取最大位数并添加一个,但系统可能会失败。那么为什么不使用 uuidv4s ,它们是独一无二的
  • 你能解释一下吗!我该如何使用这个 uuidv4s ?
  • insetad 你有一个 varchar(36) 字段并将内置函数 uuid() 添加到 insert.or beeter uuidv4 所以现在每个 id 都是唯一的,你可以通过发送它们触发到登录页面
  • 对不起,我不明白,你能回答我如何使用这个触发器吗
  • 或者,有一个想法,我把 id_user 自动递增成对,id_prof 自动递增成奇数,问题是,我可以在 MySQL 中这样做

标签: mysql sql unique cl


【解决方案1】:

这是有两个触发器的版本。

但可能会发生,并发条目将没有唯一编号,在重型服务器上这也会失败。

所以你必须获取唯一的登录ID,并在插入失败时捕获,然后尝试获取新的ID

CREATE TABLE prof(id BIGINT, name varchar(10));
CREATE TABLE user(id BIGINT, name varchar(10))
CREATE TABLE login(id BIGINT, name varchar(10))
CREATE TRIGGER before_prof_insert
BEFORE INSERT
ON prof FOR EACH ROW
BEGIN
    DECLARE prof_ BIGINT;
    DECLARE user_ BIGINT;
    DECLARE res_ BIGINT;
    SELECT MAX(id) into prof_ FROm prof;
    SELECT MAX(id) into user_ FROm user;
    
    IF user_ IS NULL AND @prof IS NULL THEN
        SET res_ := 1;
    ELSE
        IF user_ > prof_  THEN
            SET res_ := user_ + 1;
        ELSE
            SET res_ := prof_ + 1;
        END IF;
    END if;
    SET NEW.id = res_;
    
    INSERT INTO login VALUES (res_,NEW.name);

END
CREATE TRIGGER before_user_insert
BEFORE INSERT
ON user FOR EACH ROW
BEGIN
    DECLARE prof_ BIGINT;
    DECLARE user_ BIGINT;
    DECLARE res_ BIGINT;
    SELECT MAX(id) into prof_ FROm prof;
    SELECT MAX(id) into user_ FROm user;
    
    IF user_ IS NULL AND prof_ IS NULL THEN
        SET res_ := 1;
    ELSE
        IF user_ > prof_  THEN
            SET res_ := user_ + 1;
        ELSE
            SET res_ := prof_ + 1;
        END IF;
    END if;
    SET NEW.id = res_;
    
    INSERT INTO login VALUES (res_,NEW.name);

END
INSERT INTO prof VALUES (0,'profa');)
INSERT INTO user VALUES (0,'usera');
INSERT INTO prof VALUES (0,'profb');
INSERT INTO prof VALUES (0,'profc');
INSERT INTO user VALUES (0,'userb');
INSERT INTO prof VALUES (0,'profd');
SELECT * FROM prof;
编号 |姓名 -: | :---- 1 |专业 3 |教授 4 |教授 6 |教授
SELECT * FROM user;
编号 |姓名 -: | :---- 2 |用户 5 |用户b
SELECT * FROM login;
编号 |姓名 -: | :---- 1 |专业 2 |用户 3 |教授 4 |教授 5 |用户b 6 |教授

db小提琴here

这样会容易很多

INSERT INTO user VALUES (uuidv4(),'usera');
INSERT INTO prof VALUES (uuidv4(),'profa');

这将保证每个表的 id 都是唯一的。

【讨论】:

  • 非常感谢,所以我必须删除我的表并重新创建它,或者我可以继续使用我的旧表(教授、用户、登录名)吗?
  • 对于触发解决方案,您需要删除 auto_incrmeet ,如果您第二次拥有它,您需要将 int 更改为 varchar 但您可以毫无问题地使用它们。跨度>