привет в 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...
mysql: как сделать два столбца уникальными в двух таблицах одновременно
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
большое спасибо, поэтому я должен удалить свои таблицы и создать их заново, или я могу продолжить со своими старыми таблицами (проф, пользователь, логин)?
- person karbi; 23.10.2020
для решения триггера вам нужно удалить auto_incrmeet , если он у вас есть во втором, вам нужно изменить int на varchar, но вы можете использовать их без проблем.
- person nbk; 23.10.2020