Как реализовать Auto_Increment для каждого пользователя в той же таблице? - PullRequest
1 голос
/ 10 мая 2010

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

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

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

Пример:

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 |
+----+-------------+---------+------+

1 Ответ

1 голос
/ 14 мая 2010

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

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

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

...