Сохранить последний обновленный идентификатор и дату из обновления истории, сделанного во время запуска изменения обновления - PullRequest
1 голос
/ 30 июля 2011

У меня есть таблица drivers, которая имеет следующие поля:

driver_id
first_name
last_name
nationality
dob
last_update_id
last_update_datetime

Я хотел бы сохранить старые данные в таблицу drivers_history, которая в значительной степени является зеркальной копией этой таблицы изатем возвращать идентификатор этой строки и datetime обратно в таблицу drivers в полях last_update_id и last_update_datetime при каждом обновлении данных.

У меня есть следующий кодпока что для триггера, но мои знания MySQL ограничены, исходя из фона ASP.Net/SQL Server.

DROP TRIGGER IF EXISTS history_trigger $$

CREATE TRIGGER drivers_history_trigger
BEFORE UPDATE ON drivers
  FOR EACH ROW
  BEGIN
    DECLARE _count INT;
    IF OLD.first_name != NEW.first_name THEN _count = _count + 1 END IF;
    IF OLD.last_name != NEW.last_name THEN _count = _count + 1 END IF;
    IF OLD.nationality != NEW.nationality THEN _count = _count + 1 END IF;
    IF OLD.dob != NEW.dob THEN _count = _count + 1 END IF;

    IF _count > 0
    THEN
      INSERT INTO drivers_history (
        first_name,
        last_name,
        nationality,
        dob,
        last_update_id,
        last_update_datetime
      ) 
      VALUES (
        NEW.first_name,
        NEW.last_name,
        NEW.nationality,
        NEW.dob,
        NULL,
        NULL
      );
    END IF;
  END;
$$

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

Первая перефразировка кода попытки запуска

DROP TRIGGER IF EXISTS history_trigger $$

CREATE TRIGGER drivers_history_trigger
BEFORE UPDATE ON drivers
  FOR EACH ROW
  BEGIN
    DECLARE _count INT DEFAULT 0;
    IF OLD.first_name != NEW.first_name THEN _count = _count + 1 END IF;
    IF OLD.last_name != NEW.last_name THEN _count = _count + 1 END IF;
    IF OLD.nationality != NEW.nationality THEN _count = _count + 1 END IF;
    IF OLD.dob != NEW.dob THEN _count = _count + 1 END IF;

    IF _count > 0
    THEN
      INSERT INTO drivers_history (
        first_name,
        last_name,
        nationality,
        dob,
        last_update_id,
        last_update_datetime
      ) 
      VALUES (
        OLD.first_name,
        OLD.last_name,
        OLD.nationality,
        OLD.dob,
        OLD.last_update_id,
        OLD.last_update_datetime
      );
    END IF;
  END;
$$

1 Ответ

1 голос
/ 31 июля 2011

Прежде всего

DECLARE _count INT;

должно быть declare _count INT DEFAULT 0, в соответствии с документами , без указания значения default означает, что значение переменной равно NULL, а NULL + something_numeric равно NULL.

Если вы говорите, что хотите сохранить старые данные, ваш оператор вставки должен быть переписан как:

INSERT INTO drivers_history (
        first_name,
        last_name,
        nationality,
        dob,
        last_update_id,
        last_update_datetime
      ) 
      VALUES (
        old.first_name,
        old.last_name,
        old.nationality,
        old.dob,
        NULL,
        NULL
      );

Я бы хотел, чтобы вы разъяснили, что означает last_update_id? Я предполагаю, что last_update_datetime имеет тип TIMESTAMP и будет обновляться автоматически, если вы указали в операторе создания таблицы для этой таблицы. Кроме того, предоставление NULL для значений последних двух полей не позволит вам правильно получить данные, потому что вы получите NULL для обоих значений, как только вы запросите рассылку drivers_history, так что для меня это не имеет особого смысла.

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