这是有两个触发器的版本。
但可能会发生,并发条目将没有唯一编号,在重型服务器上这也会失败。
所以你必须获取唯一的登录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 都是唯一的。