0

テーブルを更新するストアド プロシージャを作成しています。

UPDATE st SET somedate = NOW();

SP のクライアントは、NOW 関数によって生成された正確な日付と時刻を知っている必要があります。

次の 2 つのオプションがあります。

1) クライアントは入力パラメーター (_now と呼ばれる) を SP に渡し、現在の日時を SP に渡します。

UPDATE st SET somedate = _now;

2) SP は NOW の出力を out パラメータにクライアントに返します。

UPDATE st SET somedate = NOW();
SELECT somedate FROM st INTO _now;

最良の選択肢は何だと思いますか? 他のオプションは可能ですか?

4

3 に答える 3

1
  • varnow = now()
  • UPDATE st set somedate = varnow
  • varnowを返す
于 2010-08-30T10:48:30.117 に答える
0

私はこのようなことをします:

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;
于 2010-08-30T11:57:13.303 に答える
-1

どちらのアプローチも間違っていると思います。

SP のクライアントは、正確な日時を知っている必要があります

なんで?クライアントがトランザクションの影響を受けるレコードを識別できなければならないということは、本当にお気付きのことと思いますが、タイムスタンプを使用してそれを行うのは正確ではありません。そして、問題は 1 秒を超えるトランザクションだけではありません。このような操作が同じ秒に 2 回発生する可能性があります。

あるグループに属していると特定する必要がある一連のレコードがある場合、それをスキーマで表現する必要があります。テーブルをさらに更新しないと仮定しても、ほとんどのトランザクションのタイムスタンプは明らかに信頼できません。

別の列または別のテーブルを追加し、代理キーを生成してトランザクションを記述します。

C.

于 2010-08-30T11:29:02.967 に答える