Создайте триггер вставки для автоматического приращения int поля составного PK (String, int), перезапустите нумерацию с 1 для новых строк - PullRequest
2 голосов
/ 08 июля 2011

Я читал, что это можно сделать без проблем, используя 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;
$$

1 Ответ

4 голосов
/ 09 июля 2011

Вы пытались объявить переменную вместо этого?

DELIMITER $$
CREATE TRIGGER `co05_test`.`ins_lineItem`
BEFORE INSERT ON `co05_test`.`my_table`
FOR EACH ROW
BEGIN
DECLARE newLineItem INT; 
SELECT 
    lineItem + 1 into newLineItem 
FROM my_table 
WHERE batch = NEW.batch
ORDER BY lineItem DESC 
LIMIT 1;

SET NEW.lineItem = newLineItem;   
END$$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...