Объединить два столбца в MySQL, один из них автоматически увеличивается с использованием триггера

Дорогие, пожалуйста, ниже приведен мой первый триггер, позволяющий сделать столбец объединенным в два столбца.. но он не работает?! могу ли я узнать, где ошибка

create table `concatcolumn`(
    `id` int(10) AUTO_INCREMENT PRIMARY key,
    `org` int(10),
    `orgid` int(20) -- this will be a concat column `org` and `id`);

delimiter $$
create trigger concatcolumn_after_insert
 AFTER insert on `concatcolumn`
  for each row
   begin
    set new.orgid = concat(new.org,new.id)
   end $$
delimiter ;



delimiter $$
create trigger concatcolumn_after_update
 AFTER update on `concatcolumn`
  for each row
   begin
    set new.orgid = concat(new.org,new.id)
   end $$
delimiter ;

введите сюда описание изображения

даже когда я заменяю ПОСЛЕ на ДО, чтобы быть

delimiter $$
 create trigger concatcolumn_after_insert
  before insert on `concatcolumn`
   for each row
    begin
     set new.orgid = concat(new.org,new.id);
    end $$;
delimiter ;

Я всегда получаю id = 0; введите сюда описание изображения

любая помощь, пожалуйста?

автоматическое заполнение столбца orgid путем объединения org и id

с уважением

Я думаю, вы получаете 0, потому что значение auto_increment еще не присвоено. Вы не можете использовать AFTER из-за такой ошибки, как «Невозможно обновить таблицу concatcolumn» в хранимой функции/триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию/триггер. будет брошен

Ergest Basha 15.07.2024 12:37

что показывает select version();?

ysth 15.07.2024 13:08

10.4.32-МарияДБ

Abd 15.07.2024 13:13

обратите внимание, что mariadb и mysql — это не один и тот же продукт, и они значительно различаются. к счастью для вас, так как есть решение вашей проблемы для mariadb, но не для mysql :)

ysth 15.07.2024 13:41

используйте последовательность вместо автоинкремента; см. stackoverflow.com/a/78518364

ysth 15.07.2024 13:45

спасибо, да... я сделаю это для другого стола... с уважением

Abd 15.07.2024 21:58
CONCAT — строковая операция. Остерегайтесь также запутанных ситуаций, таких как CONCAT(34, 5) = 345 и CONCAT(3, 45) = 345!
Rick James 22.07.2024 23:23
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
8
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вместо триггера вы можете использовать сгенерированный столбец:

CREATE TABLE `concatcolumn`(
  `id` int(10) AUTO_INCREMENT PRIMARY KEY,
  `org` int(10),
  `orgid` TEXT AS (CONCAT(`org`, `id`))
);

INSERT INTO `concatcolumn` (`org`) VALUES (20), (21), (22);

SELECT *
FROM `concatcolumn`;

UPDATE `concatcolumn`
SET `org` = 200
WHERE `id` = 1;

SELECT *
FROM `concatcolumn`;

Ни MySQL, ни mariadb не позволяют использовать столбец автоматического увеличения в сгенерированном столбце.

ysth 15.07.2024 16:21

@ysth Для PERSISTENT да, но с VIRTUAL (по умолчанию) всё в порядке. Проверено с помощью Мариадб.

yotheguitou 15.07.2024 16:27

@ErgestBasha sqlfiddle.com/mariadb/…. Версия для Ubuntu все еще позволяет это, и я также тестирую на Ubuntu... Я должен удалить свой ответ?

yotheguitou 15.07.2024 17:37

@yotheguitou на самом деле ты прав. Я только что проверил на 10.6.15-MariaDB, и это позволяет. Проблема связана с dbfiddle. В ОП есть тег MariaDB, поэтому ваш ответ действителен.

Ergest Basha 15.07.2024 17:45

dbfiddle показывает, что он не работает с 10.4 или 10.6; Я вижу, что это работает с 11.4. @ErgestBasha, ты уверен, что у тебя все заработало в версии 10.6?

ysth 15.07.2024 17:57

@ysth 100%, только что протестировал на своей работающей MariaDB на openSUSE Leap 15.5.

Ergest Basha 15.07.2024 18:00

@ErgestBasha а что там полного select version();?

ysth 15.07.2024 19:13

@ysth 10.6.15-MariaDB — полная версия

Ergest Basha 16.07.2024 09:03
Ответ принят как подходящий

Другой вариант — использовать два триггера. Триггер вставки получит значение приращения из Information_schema.tables.

Триггер 1.

DELIMITER &&

CREATE TRIGGER before_insert_concatcolumn BEFORE INSERT ON concatcolumn
 FOR EACH ROW
  BEGIN

   DECLARE autoId int;

   SElECT  auto_increment into autoId
   FROM information_schema.tables
   WHERE table_schema = database() and table_name = 'concatcolumn';

   SET NEW.orgid = concat(autoId , NEW.org );
 END

DELIMITER ;  

Поскольку вы не можете обновить одну и ту же таблицу в функции/триггере, вам необходимо получить значение auto_increment из information_schema.tables.

MariaDB [test]> SElECT  auto_increment  FROM information_schema.tables WHERE table_schema = database() and table_name = 'concatcolumn';
+----------------+
| auto_increment |
+----------------+
|              4 |
+----------------+
1 row in set (0.000 sec)

Я объявил autoId для сохранения значения auto_increment, которое будет использоваться позже в операторе set.


Триггер 2.

DELIMITER &&

 CREATE TRIGGER `before_update_concatcolumn` BEFORE UPDATE ON concatcolumn
  FOR EACH ROW
    BEGIN
     SET NEW.orgid = ( SELECT concat( NEW.id, NEW.org) FROM concatcolumn WHERE id = NEW.id )  ;
    END&&

DELIMITER ;  

спасибо большое Эргест Баша... работает, хотя первый триггер я не понял ну хахаха

Abd 15.07.2024 22:19

@Abd Я добавил объяснение, надеюсь, теперь оно стало более понятным.

Ergest Basha 16.07.2024 09:17

спасибо, дорогая, теперь все в порядке... с уважением

Abd 16.07.2024 12:39

Другие вопросы по теме