システムから取得する必要があり、それ以外の場合は挿入クエリまたは更新クエリで提供できないタイムスタンプ制約をmysqlに設定することは可能ですか?
制約でテーブルが更新されないようにすることは可能ですか? mysql ユーザーが GRANT を使用してテーブルを更新しないようにする方法は理解していますが、ルートを含むユーザーに関係なくレコードのタイムスタンプを保証することが私の目標であるため、私の場合は制約が優先される場合があります。
システムから取得する必要があり、それ以外の場合は挿入クエリまたは更新クエリで提供できないタイムスタンプ制約をmysqlに設定することは可能ですか?
制約でテーブルが更新されないようにすることは可能ですか? mysql ユーザーが GRANT を使用してテーブルを更新しないようにする方法は理解していますが、ルートを含むユーザーに関係なくレコードのタイムスタンプを保証することが私の目標であるため、私の場合は制約が優先される場合があります。
できることは、トリガーINSERT
をUPDATE
使用して値を上書きすることです
したがって、クエリが何を設定しても、目的のタイムスタンプフィールドの値は常にシステム時刻になります。
DELIMITER ;;
CREATE TRIGGER before_yourtable_insert
BEFORE INSERT ON yourtable
FOR EACH ROW
BEGIN
SET NEW.datefield := CURRENT_TIMESTAMP;
END;;
CREATE TRIGGER before_yourtable_update
BEFORE UPDATE ON yourtable
FOR EACH ROW
BEGIN
SET NEW.datefield := CURRENT_TIMESTAMP;
END;;
DELIMITER ;
編集1: 一度設定されたシステム時刻が後で更新されるのを実際に防ぎたいと思ったことに気づきました。UPDATEトリガーを少し変更して、このジョブを実行します。
SET NEW.datefield := OLD.datefield
更新のたびに値を古い値にリセットします
CREATE TRIGGER before_yourtable_update
BEFORE UPDATE ON yourtable
FOR EACH ROW
BEGIN
SET NEW.datefield := OLD.datefield;
END;;
これを試してください:MYSQLには、デフォルトのCURRENT_TIMESTAMPを持つテーブルに単一のフィールドを持つという制約があります挿入クエリの場合、これは機能します
Create table foo
(
logged_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ただし、更新の場合は、アプリケーション コードを介して、triggers
またはアプリケーション コード内で別の方法で処理する必要があります。