Генерировать значение автоматического прироста из уникального id mysql

Я собираю одни и те же подобные данные с различным значением типа на основе id в одной таблице:

 +------+---------------+-----------------+----------------+ 
 |  id  |   TransID     |     Amount      |   InsertDate   |
 +------+---------------+-----------------+----------------+ 
 |  1   |      1        |       12        |   19-03-2004   |
 |  2   |      2        |       9         |   20-03-2004   |
 |  3   |      3        |       4         |   21-03-2004   |
 |  4   |      1        |       12        |   22-03-2004   |
 |  5   |      2        |       9         |   23-03-2004   |
 |  6   |      3        |       4         |   24-03-2004   |
 |  7   |      1        |       12        |   25-03-2004   |
 +------+---------------+-----------------+----------------+ 

Когда я выбираю таблицу на основе TransID 1, я хочу иметь уникальный идентификатор автоматического увеличения для записи, основанный на идентификаторе таблицы.

Как это сделать? Таким образом, результат будет

 +------+---------------+-----------------+----------------+--------------- 
 |  id  |   TransID     |     Amount      |   InsertDate   | NewGeneratedID
 +------+---------------+-----------------+----------------+----------------- 
 |  1   |      1        |       12        |   19-03-2004   |       1
 |  4   |      1        |       12        |   22-03-2004   |       2
 |  7   |      1        |       12        |   25-03-2004   |       3
 +------+---------------+-----------------+----------------+ ---------------

И когда я выбираю только конкретный идентификатор таблицы, например id из 4, он даст мне NewGeneratedID из 2, а не 1.

 +------+---------------+-----------------+----------------+--------------- 
 |  4   |      1        |       12        |   22-03-2004   |       2
 +------+---------------+-----------------+----------------+ 

Ответ 1

Вы можете использовать следующий запрос для вашего требования

    SELECT t.id,t.TransID ,t.Amount,t.InsertDate ,(@num:[email protected]+1) AS
 NewGeneratedID  FROM table1 t cross join (SELECT @num:=0) AS dummy 
where t.TransID=1  ORDER BY id;

Ответ 2

Я должен предупредить вас, что следующий запрос неэффективен, но он может достичь того, что вам нужно.

SELECT t.id, t.TransID ,t.Amount, t.InsertDate, 
    (SELECT COUNT(id) FROM table1 AS aux 
     WHERE t.TransID = aux.TransID and aux.id <= t.id)
FROM table1 t 
WHERE t.TransID = 1  ORDER BY id;

Если процесс, в котором вы нуждаетесь, имеет решающее значение во времени, вы не должны использовать этот запрос. Однако, если вас интересует только одна запись, вам лучше использовать следующий запрос, который достаточно эффективен.

SELECT t.id, t.TransID , t.Amount, t.InsertDate, COUNT(*)
FROM table1 t inner join table1 aux where t.TransID = aux.TransID
WHERE aux.id <= t.id and t.id = 4
GROUP BY t.id, t.TransID , t.Amount, t.InsertDate;

ОБНОВЛЕНИЕ: Ограничение aux.id <= t.id устанавливает порядок среди элементов путем подсчета количества элементов с меньшим идентификатором. например, строка с id 4 имеет одну строку с меньшим идентификатором (1) для одной и той же транзакции, а строка с идентификатором 7 имеет две строки с меньшим идентификатором (1 и 4)

Ответ 3

Если вы планируете добавить столбец для этого, вы можете использовать MySQL INSERT TRIGGER что-то вроде ниже:

CREATE TRIGGER INSERT_Trigger BEFORE INSERT ON Your_Table
FOR EACH ROW BEGIN
  SET NEW.NewGeneratedID = (SELECT COUNT(*)+1 FROM Your_Table WHERE TransID = NEW.TransID);
END

EDIT: Стратегия похожа на это. Если вы используете физический столбец для NewGeneratedID, то для каждой вставки в вашей таблице подсчитайте, сколько ROW уже существует для TransID (новой строки ) и установите NewGeneratedID (новой строки) на счетчик + 1. Помните, что если вам нужно УДАЛИТЬ из таблицы, необходимо создать триггер AFTER DELETE, чтобы сделать последовательный NewGeneratedID.

Ответ 4

Используйте следующий запрос, когда вы выбираете на основе TransactionID

SELECT t.id,t.TransID ,t.Amount,t.InsertDate ,(@num:[email protected]+1) AS
NewGeneratedID  FROM MyTable t 
cross join (SELECT @num:=0) AS dummy  where t.TransID=1  ORDER BY id;

И Для проверки условия id используйте приведенный ниже запрос

select t1.* from 
(SELECT t.id,t.TransID ,t.Amount,t.InsertDate,
(@num:[email protected]+1) AS  NewGeneratedID  
FROM MyTable t 
cross join (SELECT @num:=0) AS dummy  
where t.TransID=1  ORDER BY id) t1 
where t1.id=4 ;

Ответ 5

Это мое предложение для того, что я понимаю в вашем вопросе:

Если сформированные инкрементные идентификаторы для NewGeneratedID будут постоянными:

  • Обновите таблицу и вставьте те вновь созданные идентификаторы
  • После этого теперь вы можете легко выбрать с заданным id и NewGeneratedID

Если сгенерированные новые идентификаторы для NewGeneratedID являются временными:

  • После выбора и создания инкрементных идентификаторов сохраните их в временная таблица (см. CREATE TABLE)
  • Когда данные сохраняются во временной таблице, вы можете выбрать с помощью с учетом id и NewGeneratedID
  • Очистить или удалить данные во временной таблице после сеанса

Ответ 6

Является ли поле id уже достаточно уникальным? Почему бы вам не использовать это? Если вам абсолютно необходимо новое поле, вы можете просто добавить одно или любое число в поле id и сгенерировать другое значение для каждой вставки. то есть New Field = ID + Constant.