mysql: 如何将两列同时放在两个表中

mysql: how put two columns unique in two tables at once

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

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

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

所以你必须采用唯一的登录 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;
id | name 
-: | :----
 1 | profa
 3 | profb
 4 | profc
 6 | profd
SELECT * FROM user;
id | name 
-: | :----
 2 | usera
 5 | userb
SELECT * FROM login;
id | name 
-: | :----
 1 | profa
 2 | usera
 3 | profb
 4 | profc
 5 | userb
 6 | profd

db<>fiddle here

会容易得多

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

这将保证每个 table.

的 ID 都是唯一的