ओरेस: एक फ़िल्टर - एसक्यूएल, ऑरैकल, ऑरैकल 11 जी, ऑरैकल 10 जी पर आधारित डिफ़ॉल्ट कॉलम मान

हाय एक डेवलपर ने एक टेबल पर एक कॉलम जोड़ने के लिए कहाजिसमें "एन" का डिफ़ॉल्ट मान होगा, हालांकि अगर प्रविष्टि में आईडी = 3 है तो इस कॉलम का डिफ़ॉल्ट मान "वाई" होना चाहिए, वैसे भी मैं इसे ऑरैकल में प्राप्त कर सकता हूं?

उत्तर:

जवाब के लिए 0 № 1

11 जी दृष्टिकोण

से Oracle 11g और ऊपर, आप इसे एक कदम में कर सकते हैं VIRTUAL columns

परीक्षण का मामला

SQL> CREATE TABLE tab_default (
2    ID          NUMBER,
3    flag varchar2(1) GENERATED ALWAYS AS (decode(id, 3, "Y", "N")) VIRTUAL
4  );

Table created.

SQL>
SQL> INSERT INTO tab_default (ID) VALUES (1);

1 row created.

SQL> INSERT INTO tab_default (ID) VALUES (3);

1 row created.

SQL> INSERT INTO tab_default (ID) VALUES (10);

1 row created.

SQL> SELECT * FROM tab_default;

ID F
---------- -
1 N
3 Y
10 N

SQL>

ऐसा DECODE में कार्य VIRTUAL कॉलम घोषणा आपके लिए आवश्यकता को संभालती है।

10 जी दृष्टिकोण

आप उपयोग की आवश्यकता को पूरा कर सकते हैं -

  1. DEFAULT मूल्य
  2. AFTER INSERT TRIGGER जब भी id = 3

करने के लिए टेबल बनाएँ DEFAULT "एन" के रूप में मूल्य। ट्रिगर को आग लगने दें जब मूल्य में एक नई पंक्ति डाली जाती है id कॉलम = 3, जैसे कि ट्रिगर "वाई" के मान को अद्यतन करता है। अन्य सभी मामलों के लिए अन्यथा डिफ़ॉल्ट मान "एन" होगा।


जवाब के लिए 0 № 2

अपनी तालिका में नया कॉलम जोड़ने के बाद आप नीचे क्वेरी का उपयोग करके कॉलम में मान डाल सकते हैं:

update table_name set column_name = ( case when id = 3 then "Y"  else "N" end );

नए रिकॉर्ड डालने पर आप नीचे दृष्टिकोण का उपयोग कर सकते हैं:
1) सम्मिलित क्वेरी बनाने के समय कॉलम तय करें, जब आप क्वेरी बनाते हैं तो आप इसके लिए तर्क जोड़ सकते हैं।
2) डेटाबेस में एक ट्रिगर बनाएं जो आपको तालिका में कोई भी नई पंक्ति डालने के बाद कॉलम मान को अपडेट करना चाहिए।


जवाब के लिए 0 № 3

यह एक बहुत ही खराब डेटाबेस डिजाइन है।यह संबंधपरक डेटाबेस सामान्य रूप का सम्मान नहीं करता है। मैं सुझाव देता हूं कि उस तालिका को रखने के लिए और तालिका पर एक नया दृश्य बनाएं जिसमें अतिरिक्त कॉलम है जिसे डेकोडे या केस का उपयोग करके गणना की जाती है ...


जवाब के लिए 0 № 4

मैं उन टिप्पणीकारों से सहमत हूं जिन्होंने उल्लेख किया है कि यह एक अच्छा डेटाबेस डिज़ाइन नहीं है। उस ने कहा, डेटाबेस डिजाइन के साथ समझौता करना वास्तविक जीवन स्थितियों में असामान्य नहीं है।

मुझे यकीन नहीं है कि वर्चुअल कॉलम क्या हैचाहता था। ओपी ने डिफ़ॉल्ट होने का एक तरीका मांगा; वर्चुअल कॉलम डिफ़ॉल्ट बाधा से भिन्न रूप से काम करता है (उदा।, डिफ़ॉल्ट बाधा के साथ हम कॉलम में डिफ़ॉल्ट के अलावा कोई मान डाल सकते हैं। लेने के लिए सबसे अच्छा मार्ग "डिफ़ॉल्ट" मान सेट करने के लिए ट्रिगर का उपयोग करना हो सकता है:

CREATE OR REPLACE TRIGGER mytrigger
BEFORE INSERT ON mytable FOR EACH ROW
WHEN (new.mycolumn IS NULL)
BEGIN
SELECT DECODE(id, 3, "Y", "N") INTO :new.mycolumn FROM dual;
END;
/

एक ट्रिगर भी काम करेगा चाहे आप ओरेकल 10 जी या 11 जी (दोनों जिन्हें आपने टैग किया है) का उपयोग कर रहे हों।

उम्मीद है की यह मदद करेगा।


संबंधित सवाल
सबसे लोकप्रिय