2

INSERT/UPDATE 中にデフォルトの値を優先してクエリの指定された値を無視するトリガー以外の実用的な方法はありますか?

これは私がアーカイブしたい動作です:

CREATE TABLE foo (id serial, data text);

INSERT INTO foo (data) VALUES('bar1');
INSERT INTO foo (id, data) VALUES(50, 'bar2');
INSERT INTO foo (id, data) VALUES(-34, 'bar3');
INSERT INTO foo (id, data) VALUES(80.34, 'bar4');
INSERT INTO foo (id, data) VALUES('foo5', 'bar5');
INSERT INTO foo (data) VALUES('bar6');

UPDATE foo SET id=200, data='BARn' WHERE íd=6;

SELECT * FROM foo;

+----+------+
| id | data |
+----+------+
|  1 | bar1 |
|  2 | bar2 |
|  3 | bar3 |
|  4 | bar4 |
|  5 | bar5 |
|  6 | BARn |
+----+------+

ありがとう!

4

3 に答える 3

1

あなたは本当にこれをすべきではありません。

コードが異常な動作をしないようにプログラムする必要があります。データベースに何かを挿入した後、このデータを挿入するか、エラーを発生させる必要があります。

serial次の方法で、常に一貫性を保つことができます。

  • かどうかをチェックする after insert トリガーと、かどうかをチェックNEW.id=curval('foo_id_seq')する after update トリガーを使用しNEW.id=OLD.id、このチェックが失敗した場合はエラーを発生させますが、何らかの奇妙な理由でトリガーを除外しました。
  • スーパーユーザー以外のユーザーのこのテーブルへの書き込みアクセスを無効にし、データを挿入する関数を作成します。
    create function insert_to_foo(text) は void を次のように返します
    $$ foo(data) 値 ($1) に挿入します。$$
    言語 SQL 揮発性セキュリティ定義者
    set search_path = public, pg_temp;
于 2011-10-18T09:03:59.097 に答える
1

あまり。トリガーは、ここに行く方法です。

条件付きルールも使用できます。しかし、私はしません。チェック制約を 使用すると、不要な値またはその組み合わせのみを制限できますが、例外が発生し、操作が完全にスキップされます。

于 2011-10-17T19:11:46.747 に答える