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 都是唯一的
嗨 在 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 都是唯一的