Я пишу хранимую процедуру для обновления таблицы:
UPDATE st SET somedate = NOW();
Клиент SP должен знать точную дату и время, сгенерированные функцией NOW.
Есть два варианта:
1) клиент передает входной параметр (называемый _now) в SP, дающий ему текущую дату и время
UPDATE st SET somedate = _now;
2) SP возвращает обратно выход NOW клиенту в параметр out
UPDATE st SET somedate = NOW();
SELECT somedate FROM st INTO _now;
Как вы думаете, лучший вариант? Возможны ли другие варианты?
я сделал бы что-то вроде этого:
drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varchar(32) unique not null,
created_date datetime not null
)
engine=innodb;
delimiter ;
drop procedure if exists insert_user;
delimiter #
create procedure insert_user
(
in uname varchar(32)
)
proc_main:begin
declare id int unsigned default null;
declare created datetime default null;
set created = now();
insert into users (username, created_date) values (uname, created);
set id = last_insert_id();
-- use id elsewhere maybe...
select id as user_id, created as created_date;
end proc_main #
delimiter ;
call insert_user('f00');
call insert_user('bar');
select * from users;
Я подозреваю, что оба подхода ошибочны.
клиент SP должен знать точную дату и время
Почему? Я подозреваю, что вы действительно мужчины, что клиент должен иметь возможность идентифицировать записи, затронутые транзакцией, - но использование временной метки для этого не будет точным. И это не просто транзакция, охватывающая более 1 секунды. Потенциально две такие операции могут произойти за ту же секунду.
Если у вас есть набор записей, которые вам нужно идентифицировать как принадлежащие к какой-либо группе, тогда это должно быть выражено в схеме - метка времени самой транзакции, очевидно, не надежна, даже если предположить, что у вас никогда не будет дополнительных обновлений на таблицу.
Добавьте еще один столбец или другую таблицу и создайте суррогатный ключ для описания транзакции.
С.