mysql: как сделать два столбца уникальными в двух таблицах одновременно

привет в MySQL я хочу поместить два (уникальных) поля в две разные таблицы, в моем примере у меня есть три таблицы, таблица входа, проф и пользователь. Я хочу, чтобы поле (id_user) и поле (id_prof) не повторялись, чтобы вставить их также после (unique) в таблицу логинов в поле (num), например: id_user 1, 3, 6 ... id_prof: 2, 4, 5, 7... число: 1, 2, 3, 4, 5, 6, 7...

проф таблица

таблица входа

утилизатор


person karbi    schedule 23.10.2020    source источник
comment
вы можете попробовать триггер before nsert и получить максимальное количество битов и добавить один, но эта система может выйти из строя. так почему бы не использовать uuidv4s, они уникальны   -  person nbk    schedule 23.10.2020
comment
Можете ли вы объяснить больше, пожалуйста! как я могу использовать этот uuidv4s?   -  person karbi    schedule 23.10.2020
comment
insetad числа у вас есть поле varchar (36) и добавьте встроенную функцию uuid() в вставку. a-uuidv4-in-mysql">uuidv4 так что теперь каждый идентификатор уникален, и вы можете отправить их через триггер на страницу входа   -  person nbk    schedule 23.10.2020
comment
извините, я не понимаю, можете ли вы ответить, как я могу использовать этот триггер, пожалуйста   -  person karbi    schedule 23.10.2020
comment
или, есть идея, ставлю автоинкремент id_user парами и автоинкремент id_prof в нечет, вопрос, можно ли это сделать в MySQL   -  person karbi    schedule 23.10.2020
comment
hm Создайте ТРИГГЕР ПЕРЕД ВСТАВКОЙ, ВЫБЕРИТЕ максимальный идентификатор из prof и от пользователя, увеличьте максимальное число обоих и используйте его как идентификатор   -  person nbk    schedule 23.10.2020


Ответы (1)


Это версия с двумя триггерами.

Но может случиться так, что одновременные записи будут иметь неуникальные номера, также на тяжелых серверах это также не работает.

Таким образом, вы должны взять уникальный идентификатор входа и поймать, когда вставка не удалась, а затем попытаться получить новый идентификатор.

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 здесь

Гораздо проще было бы

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

Это гарантирует, что идентификаторы уникальны для каждой таблицы.

person nbk    schedule 23.10.2020
comment
большое спасибо, поэтому я должен удалить свои таблицы и создать их заново, или я могу продолжить со своими старыми таблицами (проф, пользователь, логин)? - person karbi; 23.10.2020
comment
для решения триггера вам нужно удалить auto_incrmeet , если он у вас есть во втором, вам нужно изменить int на varchar, но вы можете использовать их без проблем. - person nbk; 23.10.2020