Дорогие, пожалуйста, ниже приведен мой первый триггер, позволяющий сделать столбец объединенным в два столбца.. но он не работает?! могу ли я узнать, где ошибка
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
с уважением
что показывает select version();
?
10.4.32-МарияДБ
Добро пожаловать в ТАК! Пожалуйста, отредактируйте свое сообщение, чтобы вставить данные в виде редактируемого контента вместо изображений. Смотрите также как спросить.
обратите внимание, что mariadb и mysql — это не один и тот же продукт, и они значительно различаются. к счастью для вас, так как есть решение вашей проблемы для mariadb, но не для mysql :)
используйте последовательность вместо автоинкремента; см. stackoverflow.com/a/78518364
спасибо, да... я сделаю это для другого стола... с уважением
CONCAT
— строковая операция. Остерегайтесь также запутанных ситуаций, таких как CONCAT(34, 5)
= 345 и CONCAT(3, 45)
= 345!
Вместо триггера вы можете использовать сгенерированный столбец:
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 Для PERSISTENT
да, но с VIRTUAL
(по умолчанию) всё в порядке. Проверено с помощью Мариадб.
@ErgestBasha sqlfiddle.com/mariadb/…. Версия для Ubuntu все еще позволяет это, и я также тестирую на Ubuntu... Я должен удалить свой ответ?
@yotheguitou на самом деле ты прав. Я только что проверил на 10.6.15-MariaDB
, и это позволяет. Проблема связана с dbfiddle. В ОП есть тег MariaDB, поэтому ваш ответ действителен.
dbfiddle показывает, что он не работает с 10.4 или 10.6; Я вижу, что это работает с 11.4. @ErgestBasha, ты уверен, что у тебя все заработало в версии 10.6?
@ysth 100%, только что протестировал на своей работающей MariaDB на openSUSE Leap 15.5.
@ErgestBasha а что там полного select version();
?
@ysth 10.6.15-MariaDB
— полная версия
Другой вариант — использовать два триггера. Триггер вставки получит значение приращения из 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 Я добавил объяснение, надеюсь, теперь оно стало более понятным.
спасибо, дорогая, теперь все в порядке... с уважением
Я думаю, вы получаете
0
, потому что значение auto_increment еще не присвоено. Вы не можете использовать AFTER из-за такой ошибки, как «Невозможно обновить таблицу concatcolumn» в хранимой функции/триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию/триггер. будет брошен