обновить все строки после вставки в mysql - PullRequest
0 голосов
/ 01 мая 2020

Я работаю с mysql, и у меня есть таблица со следующей структурой (резюме):

CREATE TABLE `costs` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `utility` DECIMAL(9,2) UNSIGNED NOT NULL,
    `tax` DECIMAL(9,2) UNSIGNED NOT NULL,
    `active` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
    `created_at` TIMESTAMP NULL DEFAULT NULL,
    `updated_at` TIMESTAMP NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
)

, где активное поле по умолчанию равно 1 при вставке, тогда я хотел бы при сохранении новая запись, все остальные строки обновляют активное поле как 0, поэтому я пытаюсь создать триггер для этого, но получаю ошибку mysql.

DELIMITER //
CREATE TRIGGER after_costs_insert AFTER INSERT ON costs FOR EACH ROW 
BEGIN
  UPDATE costs SET active = 0 WHERE id <> NEW.id;
END;
//
DELIMITER ;

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Если вам нужна только самая последняя строка, вы можете использовать:

select c.*
from costs c
order by id desc   -- or created_at
limit 1;

Это будет работать в представлении.

Чаще всего возникает ситуация, когда у вас есть один активный за что-то - например, «утилита» или что-то еще. В этом случае вы можете использовать вторичную таблицу для хранения одной строки на «что-то» вместе с идентификатором активной учетной записи. Триггер может установить эту идею.

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

0 голосов
/ 01 мая 2020

Триггер не может воздействовать на таблицу, по которой он был запущен. Это типичное ограничение в SQL, которое в основном предназначено для предотвращения бесконечного l oop при вызове (запрос запускает триггер, выполняет запрос, запускает триггер и т. Д.).

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

Если вы работаете MySQL 8.0:

create view costs_view as
select 
    id, 
    utility, 
    tax, 
    row_number() over(order by id desc) = 1 active,
    created_at,
    updated_at
from costs

В более ранних версиях:

create view costs_view as
select 
    id, 
    utility, 
    tax, 
    id = (select max(id) from costs) active,
    created_at,
    updated_at
from costs

Это дает вам всегда актуальный столбец, который вам просто не нужно поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...