मूल्य निर्धारित करने के लिए Postgresql सम्मिलित ट्रिगर




triggers postgresql-9.1 (2)

आप सही हैं कि आपको एक ट्रिगर की आवश्यकता है, क्योंकि कॉलम के लिए एक डिफ़ॉल्ट मान सेट करना आपके लिए काम नहीं करेगा - डिफ़ॉल्ट मान केवल null मानों के लिए काम करते हैं और null मानों को रोकने में आपकी मदद नहीं करते हैं।

पोस्टग्रेज में ट्रिगर बनाने के लिए कुछ चरण हैं:

चरण 1: एक फ़ंक्शन बनाएं जो टाइप trigger लौटाता है:

CREATE FUNCTION my_trigger_function()
RETURNS trigger AS '
BEGIN
  IF NEW.C1 IS NULL OR NEW.C1 = '''' THEN
    NEW.C1 := ''X'';
  END IF;
  RETURN NEW;
END' LANGUAGE 'plpgsql'

चरण 2: एक ट्रिगर बनाएं जो डालने से पहले आग लगाता है, जो आपको डाले गए मूल्यों को बदलने की अनुमति देता है, जो उपरोक्त फ़ंक्शन को आमंत्रित करता है:

CREATE TRIGGER my_trigger
BEFORE INSERT ON T
FOR EACH ROW
EXECUTE PROCEDURE my_trigger_function()

और आपने कल लिया।

उपरोक्त कोड को SQLFIddle पर निष्पादित करते हुए देखें कि यह सही ढंग से काम कर रहा है!

आप एक टिप्पणी में उल्लेख करते हैं कि मूल्य 'X' एक उपश्रेणी से लिया गया है। यदि हां, तो संबंधित पंक्ति को कुछ इस तरह से बदलें:

NEW.C1 := (select some_column from some_table where some_condition);

Postgresql में मान लें, मेरे पास एक तालिका T और इसका एक स्तंभ C1

मैं एक फ़ंक्शन को ट्रिगर करना चाहता हूं जब एक नया रिकॉर्ड टेबल T जोड़ रहा है। फ़ंक्शन को नए रिकॉर्ड में कॉलम C1 के मूल्य की जांच करनी चाहिए और यदि यह शून्य / खाली है, तो इसके मान को 'X' सेट करें।

क्या यह संभव है?


यह संभव है, लेकिन आपको इसके बजाय कॉलम पर एक डिफ़ॉल्ट बाधा निर्धारित करने से बेहतर होने की संभावना है। तालिका बनाते समय ऐसा लगेगा:

create table mytable as (
    C1 thetype not null default X
);

यह कहता है कि यदि आप तालिका में एक पंक्ति जोड़ते हैं और C1 के लिए मान निर्दिष्ट नहीं करते हैं, तो इसके बजाय X का उपयोग किया जाएगा। शून्य आवश्यक नहीं है, लेकिन अद्यतनों को उस स्तंभ को शून्य करने से रोकता है, यह मानते हुए कि आप क्या चाहते हैं।

संपादित करें: यह केवल निरंतर X के लिए काम करता है, आपकी टिप्पणियों से ऐसा लगता है कि दो संभावित समाधान हैं।

ट्रिगर का उपयोग कुछ इस तरह होगा:

create function update_row_trigger() returns trigger as $$
begin
    if new.C1 is NULL then
        new.C1 := X;
    end if;
    return new;
end
$$ language plpgsql;

create trigger mytrigger before insert on mytable for each row execute procedure update_row_trigger();

ट्रिगर फ़ंक्शन में new वैरिएबल विशेष है, जिसमें पंक्ति को सम्मिलित किया गया है। ट्रिगर को before insert के ट्रिगर के रूप में निर्दिष्ट करने का मतलब है कि आप तालिका में लिखे जाने से पहले पंक्ति को संशोधित कर सकते हैं।

दूसरा उपाय एक गणना किए गए कॉलम का उपयोग करना होगा, जो एक असामान्य तरीके से परिभाषित करता है:

create or replace function C1(row mytable) returns columntype immutable as $$
begin
    return X; -- where X is an expression using values from `row`
end
$$ language plpgsql;

यह एक फ़ंक्शन बनाता है जो आपकी तालिका की एक पंक्ति लेता है और एक मूल्य लौटाता है, आप इसका उपयोग करके कॉल कर सकते हैं। हालांकि नोटेशन, जिसका अर्थ है आप कर सकते हैं:

select
    *,
    t.C1
from
    mytable t;

फ़ंक्शन के अपरिवर्तनीय होने की घोषणा वैकल्पिक है, लेकिन यदि आप "कॉलम" को इंडेक्स करना चाहते हैं, तो इसकी आवश्यकता है। आप इस कॉलम को इस तरह अनुक्रमित कर पाएंगे:

create index on mytable (C1(mytable));




postgresql-9.1