あなたが提供した限られた情報から最適な解決策を推測することはできません。
いずれにせよ、クエリはプリンシパルで失敗します。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