2014-03-31 8 views
2

Есть ли способ автоматического увеличения поля id моей базы данных на основе значений двух других столбцов в вставленной строке?Идентификатор автоинкремента MySQL, основанный на значениях двух других столбцов

Я хотел бы настроить свою базу данных так, чтобы при вставке нескольких строк одновременно они сохраняли свой порядок tracknumber. Поле ID должно автоматически увеличиваться, основываясь сначала на автоматически сгенерированном поле timestamp, а затем во втором - tracknumber, содержащемся в этой временной отметке.

Вот пример того, как база данных может выглядеть:

id | tracknumber | timestamp 
________________________________________ 

1 | 1   | 2014-03-31 11:35:17 
2 | 2   | 2014-03-31 11:35:17 
3 | 3   | 2014-03-31 11:35:17 
4 | 1   | 2014-04-01 09:10:14 
5 | 2   | 2014-04-01 09:10:14 

Я читал на триггеры, но не уверен, если это уместно? Мне кажется, что у меня нет очевидной функции.

ответ

0

Если вы вставляете их в одну транзакцию и/или скрипт, то сортируйте данные самостоятельно на стороне сервера в соответствии с этими двумя полями (при условии, что вы создаете временную метку на стороне сервера, так как это может показаться логичным), а затем вставьте строки один за другим. Я не думаю, что нужно переубедить это и искать сложный подход в базе данных. База данных по-прежнему будет вставлять строки один за другим, а не все сразу, поэтому нет способа узнать, что она должна выполнить какую-то сортировку заранее. Это вы должны это сделать.

+0

Полезно - определенно переусердствовал. Теперь с помощью ORDER BY в нескольких столбцах для правильной сортировки. – Byate

1

Это немного для комментария.

автоматический способ для этого. Вы можете сделать это с помощью триггеров, если хотите. Обратите внимание на множественное число, вам понадобятся триггеры для insert, update и delete, если вы хотите, чтобы нумерация оставалась точной при изменении данных.

Вы можете сделать это на стороне запроса, если целью является перечислить значения. Вот один метод с использованием подзапроса:

select t.*, 
     (select count(*) from table t2 where t2.timestamp = t.timestamp and t2.id <= t.id 
     ) as tracknumber 
from table t; 

Производительность этого может даже быть разумным с индексом на table(timestamp, id).

Если данные создаются один раз, вы также можете заполнить значения с помощью запроса update.

Смежные вопросы