как я могу обновить запись в этом случае? - PullRequest
1 голос
/ 26 апреля 2011

Я сохраняю различные действия с идентификаторами 1,2,3,4 последовательно.

Если я удаляю 2-ю запись (id 2), как я могу обновить, чтобы 3 стало 2, а 4 стало 3?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Ответ 1. Вы не хотите. Вся цель поля id состоит в том, что оно является неизменным.

Ответ 2. Вы не хотите. Если вам нужно сделать это, поле id вообще не поле id, а поле данных.

Ответ 3. Удалите записи и вставьте их снова с новыми номерами. Вы можете видеть, что это становится очень дорогим, если количество строк велико.

1 голос
/ 26 апреля 2011

Как насчет использования подхода связного списка , где каждое действие указывает на следующее?

select * from activity;
+----+---------+
| id | next_id |
+----+---------+
|  1 |       2 |
|  2 |       3 |
|  3 |       4 |
|  4 |       5 |
|  5 |    NULL |
+----+---------+

Если вы хотите удалить операцию с ID = 2, вам нужно обновить строку, которая указывает на ID = 2, до строки, на которую ранее был указан ID = 2.

update activity
   set next_id = 3
 where id = 1;

delete
  from activity 
 where id = 2;

+----+---------+
| id | next_id |
+----+---------+
|  1 |       3 |
|  3 |       4 |
|  4 |       5 |
|  5 |    NULL |
+----+---------+

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

1 голос
/ 26 апреля 2011
update table set col1 = col1-1 where col1>2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...