Как я могу обновить данные каждого поля при удалении строк - PullRequest
0 голосов
/ 20 января 2020

Я ищу способ обновить некоторые строки сразу после того, как я удалил несколько строк на MariaDB.

Например, мои тальбы выглядят так:

--------------------------------------
| main_id |  name   | value | sub_id |
--------------------------------------
|   1     | DRINKS  | 1000  |  COKE  |
|   1     | DRINKS  | 2000  |  BEER  |
|   1     | DRINKS  | 0600  | WATER  |
|   2     | SALAD   | 2000  | Peanut |
|   3     | BREADS  | 1500  | FLAT   |
|   3     | BREADS  | 1000  | TOAST  |
|   4     | BEEF    | 3000  | SAUSAGE|
...

Когда я удаляю '2' SALAD, я хочу обновить все строки main_id до main_id-1, например

--------------------------------------
| main_id |  name   | value | sub_id |
--------------------------------------
|   1     | DRINKS  | 1000  |  COKE  |
|   1     | DRINKS  | 2000  |  BEER  |
|   1     | DRINKS  | 0600  | WATER  |
|   2     | BREADS  | 1500  | FLAT   |
|   2     | BREADS  | 1000  | TOAST  |
|   3     | BEEF    | 3000  | SAUSAGE|
...
//  |   2     | SALAD   | 2000  | Peanut | has removed so every main_id updated.

Я не могу использовать PRIMARY KEY, потому что все так много дублируется.

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

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 20 января 2020

После оператора Delete:

DELETE FROM t WHERE main_id = 2;

оператор Update, содержащий Analyti c, может быть выполнен при условии, что ваша версия БД 10.2+:

UPDATE t
  JOIN (WITH t2 AS
       (
        SELECT LAG(main_id,1) OVER (ORDER BY main_id) AS lg, t.* 
          FROM t
       )
       SELECT t2.*,
              1 + SUM(CASE WHEN COALESCE(lg,main_id) = main_id THEN 0 ELSE 1 END ) 
              OVER (ORDER BY main_id) AS new_id
         FROM t2 ) t2
    ON t.main_id = t2.main_id           
   SET t.main_id = t2.new_id;

для получения main_id - 1 обновляется для столбца main_id для main_id> 2 для этого отдельного случая.

Невозможно применить триггер удаления, содержащий обновление, из-за проблемы мутирующего триггера.

Демо

...