0

私はここの初心者であり、PostgreSQL も使用しています。2 つの異なるテーブルに 2 つの異なるブール列があります。trueのようにブール列を更新すると、ブール列もにtableone設定する必要があります。 tabletwotrue

例: (これらは によって関連付けられていますsipariskod)

UPDATE tabletwo 
SET kalemonay = tableone.sonaydurum 
FROM  tableone 
WHERE tabletwo.sipariskod='10'

この SQL クエリを使用しましたが、うまくいきませんでした。どうしてか分かりません。:(

ブール値を更新するときに実行する関数またはトリガーが必要です。同じものがある場合tableoneは、ブール値も更新します。tabletwosipariskod

どんな助けにも感謝します。

4

1 に答える 1

1

あなたが提供した限られた情報から最適な解決策を推測することはできません。

いずれにせよ、クエリはプリンシパルで失敗します。2 つのテーブルを接続する条件がないため、高価で無意味なデカルト積になりCROSS JOINます。事実上、単一の更新ではなく、 のすべての行に対して 1 つの更新を取得しtableone、これらのどれが最後に適用されて永続的な効果を持つかは定義されていません。

あなたが提供したので:

(これらは sipariskod によって関連付けられています)

.. クエリは次のようになります。

UPDATE tabletwo t2
SET    kalemonay = t1.sonaydurum 
FROM   tableone t1
WHERE  t2.sipariskod = t1.sipariskod
AND    t1.??? = ???

ただし、このステートメントは、オブジェクトを使用できるトリガー関数内では異なって見えNEWます。たとえば、トリガーのトリガー関数内

CREATE TRIGGER foo
AFTER UPDATE ON TABLE ON tableone
FOR EACH ROW EXECUTE PROCEDURE foo();

トリガー関数は次のようになります。

CREATE OR REPLACE FUNCTION foo()
  RETURNS trigger AS
$func$
BEGIN

IF NEW.sonaydurum IS DISTINCT FROM OLD.sonaydurum THEN
   UPDATE tabletwo t2
   SET    kalemonay = NEW.sonaydurum 
   WHERE  t2.sipariskod = NEW.sipariskod;
   AND    kalemonay IS DISTINCT FROM NEW.sonaydurum;
END IF;

RETURN NULL;

END
$func$ LANGUAGE plpgsql;

空の更新を避けるために、いくつかのチェックを追加しました。

外部キー

しかし、外部キー制約と. 詳細によります。外部キーを作成する前に、参照元のテーブルから問題のある値を削除し、参照先の列に一意の (またはプライマリ) インデックスを作成する必要があります。外部キーは複数の列で構築できることをご存知ですか?ON UPDATE CASCADE

于 2013-04-12T15:18:36.470 に答える