Теперь я читал несколько тем и провел некоторое исследование о внесении изменений в таблицу mysql. Сначала позвольте мне объяснить мою ситуацию:
У меня есть система билетов с таблицей : "билет"
На данный момент я создал триггеры, которые будут вводить повторяющуюся запись в моей таблице : "ticket_history" , которая имеет "действие", "пользователь" и "временную метку" в качестве дополнительных столбцов. Через несколько недель и тестирования я немного недоволен этой сборкой, поскольку каждое изменение создает полную копию моей строки в таблице истории. Я действительно понимаю, что дисковое пространство дешево, и я не должен беспокоиться об этом, но для того, чтобы получить какой-то журнал или красивую историю для пользователя, это болезненно, по крайней мере для меня. Также с помощью триггера, который я написал, я получаю новую строку в истории, даже если изменений нет. Но это всего лишь дефект дизайна моего спускового крючка!
Здесь мой триггер:
BEFORE UPDATE ON ticket FOR EACH ROW
BEGIN
INSERT INTO ticket_history
SET
idticket = NEW.idticket,
time_arrival = NEW.time_arrival,
idticket_status = NEW.idticket_status,
tmp_user = NEW.tmp_user,
action = 'update',
timestamp = NOW();
END
Мой новый подход, чтобы избежать наличия триггеров
После некоторого времени на эту тему я придумал подход, который я хотел бы обсудить и реализовать. Но сначала у меня возникнут некоторые вопросы:
Моя идея - создать новую таблицу:
id sql_fwd sql_bwd keys values user timestamp
-------------------------------------------------------------------------
1 UPDATE... UPDATE... status 5 14 12345678
2 UPDATE... UPDATE... status 4 7 12345678
Поток будет выглядеть так:
Сначала я бы выбрал что-то или более из БД:
SELECT keys FROM ticket;
Затем я выводю данные в 2 поля ввода:
<input name="key" value="value" />
<input type="hidden" name="key" value="value" />
Нажмите и отправьте его моей функции:
Я бы снова начал с SELECT: SELECT * FROM ticket;
и убедитесь, что скрытое поле ввода == значение из последнего выбора. Если так, я могу продолжить и знать, что ни один другой пользователь не изменил что-то в то же время. Если скрытое поле не соответствует, я возвращаю пользователя в форму и выводит сообщение.
Далее я создам SQL-запросы для действия, а также запрос, чтобы отменить эти изменения.
$sql_fwd = "UPDATE ticket
SET idticket_status = 1
WHERE idticket = '".$c_get['id']."';";
$sql_bwd = "UPDATE ticket
SET idticket_status = 0
WHERE idticket = '".$c_get['id']."';";
После этого я запустите UPDATE в билет и вставьте новую запись в свою новую таблицу для ведения журнала.
С этим я могу попытаться поймать возможные перезаписи, в то время как два пользователя редактируют один и тот же билет за одно и то же время, и для моей истории я мог просто искать ключи и значения и генерировать какой-то список. Также имея SQL_BWD, я просто могу отменить изменения.
Мои вопросы к этому будут:
- Было бы заметно делать дополнительный выбор каждый раз, когда я хочу что-то обновить?
- Я могу потерять некоторые преимущества, которые у меня были бы с триггерами?
- Есть ли большие недостатки
- Есть ли какие-либо функции на моем сервере mysql или с php, которые уже делают что-то подобное?
- Или может быть гораздо более простой способ сделать что-то вроде этого
- Возможно, небольшое изменение в моем триггере уже достаточно?
- Если я понимаю это право, MySQL выполняет обновление только в том случае, если значение изменилось, но триггер выполняется в любом случае правильно?
- Если я могу изменить триггер, могу ли я все же предотвратить каким-либо образом перезапись данных, а 2 пользователя попытаются изменить билет одновременно на сервере mysql или я буду делать это в любом случае с PHP?
Спасибо за помощь уже