Я читал, что это можно сделать без проблем, используя MyISAM, так как это поведение по умолчанию, но я использую InnoDB, поэтому для этого нужен триггер.
Два поля PK: партия и lineItem .Если запись удалена, я хочу, чтобы нумерация начиналась с наибольшего целого числа для batch .Не заполняйте отверстия.
Это настройка среды тестирования для устаревшей системы.Так что схема такая, какая есть, я подумал, что упомяну это, чтобы избежать каких-либо дискуссий о том, хороша она или нет.
Редактировать : я хочу что-то вроде следующего оператора вставкив качестве триггера
INSERT INTO payroll(`batch`,`lineItem`)
(select 'T105',t1.lineItem + 1 from payroll as t1 where batch = 'T105' order by lineItem desc limit 1);
Но где 'T105' (идентификатор партии) жестко запрограммирован, я хочу, чтобы триггер выбрал это из вставки.
Так что я хочу иметь возможностьскажем что-то вроде:
INSERT INTO payroll(`batch`)VALUES('T001','T001','T001', 'T002', 'T002', 'T002');
, и я ожидаю увидеть в таблице:
batch lineItem
T001 1
T001 2
T001 3
T002 1
T002 2
T002 3
Получение дальше :
В попыткереализовать это я придумал:
DELIMITER $$
CREATE TRIGGER `co05_test`.`ins_lineItem`
BEFORE INSERT ON `co05_test`.`my_table`
FOR EACH ROW
BEGIN
select lineItem + 1 into @newLineItem from my_table where batch = NEW.batch order by lineItem desc limit 1;
set NEW.lineItem = @newLineItem;
END$$
Однако, когда я пытаюсь ...
INSERT INTO `co05_test`.`my_table`(`batch`)VALUES('T001');
я получаю эту ошибку: столбец 'lineItem' не может быть нулевым
Что определяется как недопустимое значение, но я думаю, что триггер должен установить значение!
Решение, которое я использовал :
-- Trigger DDL Statements
DELIMITER $$
USE `co05_test`$$
CREATE TRIGGER `co05_test`.`ins_lineItem`
BEFORE INSERT ON `co05_test`.`my_table`
FOR EACH ROW
BEGIN
select count(*) into @batchCount from my_table where batch = NEW.batch;
select lineItem + 1 into @newLineItem from my_table where batch = NEW.batch order by lineItem desc limit 1;
if @batchCount > 0 then
set NEW.lineItem = @newLineItem;
else
set NEW.lineItem = 1;
end if;
END;
$$