1

Я хотел бы иметь несколько пользователей, которые используют одни и те же таблицы в базе данных, но имеют одно значение auto_increment для каждого пользователя. Я буду использовать встроенную базу данных, JavaDB и, как я знаю, не поддерживает эту функциональность. Как я могу это реализовать?Как реализовать Auto_Increment для пользователя в той же таблице?

Должен ли я внедрить триггер на вставках, которые ищут последнюю вставленную пользователем строку, а затем добавить ее или есть лучшая альтернатива? Или лучше реализовать это в коде приложения?

Или это просто плохая идея? Я думаю, что это легче поддерживать, чем создавать новые таблицы для каждого пользователя.

Пример:

table 
+----+-------------+---------+------+ 
| ID | ID_PER_USER | USER_ID | DATA | 
+----+-------------+---------+------+ 
| 1 |   1 |  2 | 3454 | 
| 2 |   2 |  2 | 6567 | 
| 3 |   1 |  3 | 6788 | 
| 4 |   3 |  2 | 1133 | 
| 5 |   4 |  2 | 4534 | 
| 6 |   2 |  3 | 4366 | 
| 7 |   3 |  3 | 7887 | 
+----+-------------+---------+------+ 

SELECT * FROM table WHERE USER_ID = 3 
+----+-------------+---------+------+ 
| ID | ID_PER_USER | USER_ID | DATA | 
+----+-------------+---------+------+ 
| 3 |   1 |  3 | 6788 | 
| 6 |   2 |  3 | 4366 | 
| 7 |   3 |  3 | 7887 | 
+----+-------------+---------+------+ 

SELECT * FROM table WHERE USER_ID = 2 
+----+-------------+---------+------+ 
| ID | ID_PER_USER | USER_ID | DATA | 
+----+-------------+---------+------+ 
| 1 |   1 |  2 | 3454 | 
| 2 |   2 |  2 | 6567 | 
| 4 |   3 |  2 | 1133 | 
| 5 |   4 |  2 | 4534 | 
+----+-------------+---------+------+ 
+0

Зачем вам нужен отдельный идентификатор автоинкремента на пользователя? –

+0

@Todd: Потому что я хочу «серийный номер» для каждого пользователя. – Jonas

+0

Сколько сеансов будет выполняться одновременно? –

ответ

1

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

Но не ходите за столом на пользователя. Это сделает ваш SQL-код действительно уродливым и предотвратит использование какого-либо типа sql-плана.

Возможно, вам лучше обслуживать временную метку вместо серийного номера.

+0

Спасибо. Да, с меткой времени было бы проще, но мне действительно нужен «серийный номер», подумайте об этом как «номер счета». – Jonas