Генерировать значение автоматического прироста из уникального 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.