Как я могу сгенерировать идентификатор на основе других полей в моих таблицах в MySQL?

Моя цель - создать столбец в таблице Users , который заполняется автоматически на основе данных, введенных в столбцы name и фамилия . В настоящее время я использую триггер с конкатенацией для выполнения этого действия, однако при вводе полей объединенное значение ID возвращает его как «0», не могли бы вы сказать мне, почему это происходит? И, если возможно, как это исправить.

Мой код выглядит следующим образом:

CREATE TABLE Usuarios (ID int not null key auto_increment, nombre varchar(20) not null, 
apellido varchar(20) not null, code varchar(12) not null);

И мой триггер выглядит следующим образом:

CREATE TRIGGER conca
BEFORE INSERT ON usuario FOR EACH ROW
BEGIN SET NEW.code = CONCAT(NEW.ID,substring(NEW.nombre,1,2),substring(NEW.apellido,1,2));
END

Для ввода данных:

INSERT INTO Usuarios (nombre, apellido) VALUES ('Miguel','Valdez');

При этом, При отображении данных в пользовательской таблице я получаю следующий результат:

+----+--------+----------+-------+
| ID | name   | apellido | code  |
+----+--------+----------+-------+
|  1 | Miguel | Valdez   | 0MiVa |
+----+--------+----------+-------+

Заранее большое спасибо.

2
задан 27.11.2019, 05:50
3 ответа

Верно, я не знаю, почему он помещает 0, он подозревал, что это не был вопрос проб, но также, так что я это решил, не используя new , а вычисляя последний пойдите и увеличивая единицу , это осталось бы так:

  • Выбор 1: издавая trigger с phpMyAdmin или МИСКЛ Воркбенч
BEGIN
declare id_var int default (select max(id) from usuarios);
set id_var =id_var+1;
SET NEW.code = CONCAT(id_var,substring(NEW.nombre,1,2),substring(NEW.apellido,1,2));
END
  • Выбор 2: удаляя существующий trigger и выполняя с консоли
DELIMITER $
CREATE TRIGGER conca
BEFORE INSERT ON usuarios FOR EACH ROW
BEGIN
declare id_var int default (select max(id) from usuarios);
set id_var =id_var+1;
SET NEW.code = CONCAT(id_var,substring(NEW.nombre,1,2),substring(NEW.apellido,1,2));
END;
$
DELIMITER ;
1
ответ дан 01.12.2019, 10:46

Если ты находишься в MySQL наверху 5.7, лучше используй исчисленную колонну:

ALTER TABLE usuario
ADD COLUMN gen_code AS
CONCAT(ID,substring(nombre,1,2),substring(apellido,1,2));

Также проверяет документацию https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html , так как ты мог бы использовать Stored или Виртуально как выборы, у него есть лучшее выступление stored, так как только вычисляется стоимость, сделав insert или update, но завершите немного места, Виртуальный не трать место, но он вычисляется в полет тогда тратит больше ресурсов, если это много линий, возвращенных в консультации, которая включала бы эту колонну.

1
ответ дан 01.12.2019, 10:46
  • 1
    Intenté использовать generated always, но не я это permitió ввиду auto_increment поля идентификация " Function or expression ' AUTO_INCREMENT' cannot be used in the GENERATED ALWAYS СХВАТИ clause of ID " – Miguel V 27.11.2019, 06:28
  • 2
    Протестируй без generated always🠘 ‰ – Jesús Franco 27.11.2019, 06:40

Протестируй следующее а:

ВЕРЬТЕ В TRIGGER conca BEFORE INSERT ON пользователь FOR EACH ROW BEGIN SET NEW.code = CONCAT (OLD.ID, substring (OLD.nombre, 1,2), substring (OLD.apellido, 1,2)); END

1
ответ дан 01.12.2019, 10:46