7

チェック制約(またはその他の手法)を使用して、レコードが更新されたときに以前の値と矛盾する値が設定されないようにすることはできますか。

1つの例は、「file_exported」のように何かが起こったことを示すNULLタイムスタンプです。ファイルがエクスポートされ、NULL以外の値が設定された後は、そのファイルを再度NULLに設定しないでください。

もう1つの例は、ヒットカウンターです。この場合、整数は増加のみが許可されますが、減少することはできません。

postgresqlを使用しているのに役立つが、SQL実装に適合するソリューションが欲しい

4

4 に答える 4

8

トリガーを使用します。これは、と値ON UPDATE ... FOR EACH ROWの両方を表示できる単純なPL/PgSQLトリガーに最適なジョブです。NEWOLD

トリガー手順を参照してください。

于 2013-01-16T23:40:39.840 に答える
3

lfLoopは質問に対する最良のアプローチを持っています。しかし、トリガーを使用してCraig Ringerのアプローチを継続するために、ここに例を示します。基本的に、更新する前に、列の値を元の(古い)値に戻します。

CREATE OR REPLACE FUNCTION example_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
     new.valuenottochange := old.valuenottochange;
     new.valuenottochange2 := old.valuenottochange2;
     RETURN new;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;



DROP TRIGGER IF EXISTS trigger_name ON tablename;
  CREATE TRIGGER trigger_name BEFORE UPDATE ON tablename
    FOR EACH ROW EXECUTE PROCEDURE example_trigger();
于 2014-03-18T00:15:24.273 に答える
2

1つの例は、「file_exported」のように何かが起こったことを示すNULLタイムスタンプです。ファイルがエクスポートされ、NULL以外の値が設定された後は、そのファイルを再度NULLに設定しないでください。

もう1つの例は、ヒットカウンターです。この場合、整数は増加のみが許可されますが、減少することはできません。

どちらの場合も、これらの変更を注釈付きテーブルの属性として記録することはありません。「エクスポートされた」または「ヒット数」は明確なアイデアであり、関連するオブジェクトからの関連するが直交する実世界の概念を表します。

したがって、それらは単に異なる関係になります。「file_exported」を1回だけ発生させたいので、次のようにします。

CREATE TABLE thing_file_exported(
    thing_id INTEGER PRIMARY KEY REFERENCES(thing.id),
    file_name VARCHAR NOT NULL
)

ヒットカウンターも同様に別のテーブルです。

CREATE TABLE thing_hits(
    thing_id INTEGER NOT NULL REFERENCES(thing.id),
    hit_date TIMESTAMP NOT NULL,
    PRIMARY KEY (thing_id, hit_date)
)

そして、あなたはでクエリするかもしれません

SELECT thing.col1, thing.col2, tfe.file_name, count(th.thing_id)
FROM thing 
LEFT OUTER JOIN thing_file_exported tfe
    ON (thing.id = tfe.thing_id)
LEFT OUTER JOIN thing_hits th
    ON (thing.id = th.thing_id)
GROUP BY thing.col1, thing.col2, tfe.file_name
于 2013-01-17T21:44:49.853 に答える
1

PostgreSQLのストアドプロシージャと関数は、古い値と新しい値の両方にアクセスでき、そのコードは任意のテーブルと列にアクセスできます。ストアドプロシージャで単純な(粗い?)有限状態マシンを構築することは難しくありません。その方法でテーブル駆動のステートマシンを構築することもできます。

于 2013-01-16T22:18:22.847 に答える