В настоящее время я разрабатываю услугу считывания токенов (RFID) для моего удовольствия и знаний, поверьте или нет. Я говорю по-французски лучше, чем по-английски, поэтому, пожалуйста, извинения. Гугл переводчик мой друг, но ...
Мой проект действительно прост:
- RFID считыватель куплен по желанию
- Веб-страница HTML с кодом RFID, читаемая
Ajax Query, делающий SELECT для моей таблицы t_rfids кодов для извлечения прикрепленного пользователя
ЕСЛИ the_users_id НЕ ПУСТО ВСТАВИТЬ запись t_accesslogs.
Это структура таблицы:
CREATE TABLE test_punch.t_accesslogs (
id_tokenaccesslog bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
punchtime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
id_ref_user bigint(20) UNSIGNED NOT NULL,
PRIMARY KEY (id_tokenaccesslog)
)
ENGINE = INNODB,
CHARACTER SET latin1,
COLLATE latin1_swedish_ci;
Итак, сделав простой INSERT INTO t_accesslogs (id_ref_user) VALUES (3); я получил свою запись для CURRENT_TIMESTAMP.
Все работает хорошо, но я пытаюсь оптимизировать журналы доступа в запись временной карты с датой, time_start, time_end. Структура таблицы:
CREATE TABLE test_punch.t_timecards (
id_timecard bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
id_ref_user bigint(20) UNSIGNED NOT NULL,
day_date date NOT NULL,
time_begin time NOT NULL,
time_end time DEFAULT NULL,
PRIMARY KEY (id_timecard)
)
ENGINE = INNODB,
CHARACTER SET latin1,
COLLATE latin1_swedish_ci;
Я пытаюсь найти лучший способ заполнить эти таблицы без использования внешних кодов, поэтому я попробую Триггеры. Есть код триггера:
CREATE
DEFINER = 'root'@'localhost'
TRIGGER test_punch.add_timecard_entry
AFTER INSERT
ON test_punch.t_accesslogs
FOR EACH ROW
BEGIN
DECLARE bint_IdTimeCard BIGINT;
DECLARE dt_Punch DATE;
DECLARE time_Start TIME;
DECLARE time_End TIME;
SELECT t_timecards.id_timecard INTO bint_IdTimeCard
FROM t_timecards
WHERE t_timecards.id_ref_user = NEW.id_ref_user
AND day_date = CAST(NEW.punchtime as DATE)
AND time_begin IS NOT NULL
AND time_end IS NULL;
IF (bint_IdTimeCard IS NOT NULL) THEN
UPDATE t_timecards
SET t_timecards.time_end = CAST(NEW.punchtime AS TIME)
WHERE t_timecards.id_timecard=bint_IdTimeCard
AND t_timecards.id_ref_user=NEW.id_ref_user;
ELSE
INSERT INTO t_timecards (id_ref_user,day_date,time_begin)
VALUES (NEW.id_ref_user,
CAST(NEW.punchtime AS DATE),
CAST(NEW.punchtime AS TIME));
END IF;
END
Первое, что я не уверен, это значение, возвращаемое, если значение SELECT равно Null. это настоящий NULL или пустой? Как уже говорилось ранее, трудно отлаживать, даже если я использую dbForge Studio (см. Отладка триггеров MySQL )
На самом деле поведение кода не похоже на правильную обработку оператора IF. Есть идеи о том, что я делаю не так?
Любая помощь будет оценена.
Спасибо
Martin