2011-03-22 14 views
8

मैं एक Oracle डाटाबेस, और कई नहीं अशक्त कॉलम युक्त तालिका है, सभी मूलभूत मूल्यों के साथ।सम्मिलित डिफ़ॉल्ट मान जब अशक्त डाला जाता है

मैं किसी भी डेटा मैं सम्मिलित करना चाहते हैं के लिए एक डालने कथन का उपयोग करना चाहते हैं, और अगर मान डाला nulls हैं या नहीं की जाँच करने के लिए परेशान नहीं है।

वहाँ किसी भी तरह से पीछे हटना स्तंभ डिफ़ॉल्ट मान पर जब अशक्त डाला जाता है है?

<?php 
if (!empty($values['not_null_column_with_default_value'])) { 
    $insert = " 
     INSERT INTO schema.my_table 
      (pk_column, other_column, not_null_column_with_default_value) 
     VALUES 
      (:pk_column,:other_column,:not_null_column_with_default_value) 
    "; 
} else { 
    $insert = " 
     INSERT INTO schema.my_table 
      (pk_column, other_column) 
     VALUES 
      (:pk_column,:other_column) 
    ";   
} 

तो, मैं पूरी तरह से कॉलम छोड़ है, या मैं त्रुटि "नहीं अशक्त स्तंभ के लिए डालने की कोशिश कर रहा अशक्त" होगा:

मैं इस कोड है। बेशक मेरे पास कई शून्य कॉलम हैं, इसलिए कोड डालने वाला कथन बहुत अपठनीय, बदसूरत है, और मुझे बस इसे इस तरह पसंद नहीं है।

मैं, एक बयान करना चाहते हैं के लिए कुछ इसी तरह:

INSERT INTO schema.my_table 
    (pk_column, other_column, not_null_column_with_default_value) 
VALUES 
    (:pk_column,:other_column, NVL(:not_null_column_with_default_value, DEFAULT)); 

कि निश्चित रूप से एक काल्पनिक प्रश्न है। क्या आप ओरेकल डीबीएमएस के साथ उस लक्ष्य को प्राप्त करने के किसी भी तरीके से जानते हैं?

संपादित:

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

नहीं वास्तव में मैं देखना चाहता है, लेकिन कोई बेहतर विकल्प चाहते हैं।

+0

कारण है कि आप शब्द "डिफ़ॉल्ट" के बदले "not_null_column_with_default_value" कॉलम का डिफ़ॉल्ट मान में प्रवेश नहीं करते हो जाएगा "hypothetical क्वेरी" के अंदर? – palindrom

+0

क्योंकि मुझे नहीं पता कि डालने के समय डिफ़ॉल्ट मूल्य क्या है। लेकिन जैसा कि @ विन्सेंट मालग्रैट ने सुझाव दिया है कि मैं उस फॉर्म को ला सकता हूं ALL_TAB_COLUMNS – SWilk

उत्तर

11

जो लोग इसे अब पढ़ने के लिए: यदि यह रिक्त है तो आप निम्न अद्यतन चला सकते हैं

ओरेकल 12C में वहाँ नई सुविधा है: DEFAULT ON NULL। उदाहरण के लिए:

CREATE TABLE tab1 (
    col1  NUMBER DEFAULT 5, 
    col2  NUMBER DEFAULT ON NULL 7, 
    description VARCHAR2(30) 
); 

तो जब आप col2 में अशक्त INSERT करने की कोशिश, यह स्वचालित रूप से 7.

2

जैसा कि AskTom thread में बताया गया है, DEFAULT कीवर्ड केवल कॉलम सम्मिलन में स्टैंड-अलोन अभिव्यक्ति के रूप में काम करेगा और एनवीएल जैसे कार्यों या अभिव्यक्तियों के साथ मिश्रित होने पर काम नहीं करेगा।

INSERT INTO schema.my_table 
    (pk_column, other_column, not_null_column_with_default_value) 
VALUES 
    (:pk_column,:other_column, DEFAULT) 

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

दूसरे शब्दों में यह एक वैध क्वेरी है। यह आपके $insert में स्ट्रिंग DEFAULT के साथ स्ट्रिंग :not_null_column_with_default_value को प्रतिस्थापित करने जितना आसान हो सकता है।

तुम भी दृश्य ALL_TAB_COLUMNS क्वेरी और nvl(:your_variable, :column_default) इस्तेमाल कर सकते हैं। डिफ़ॉल्ट मान कॉलम DATA_DEFAULT है।

+0

data_default के बारे में सुझाव के लिए धन्यवाद। मुझे लगता है कि मैं एक फंक्शन 'get_default (स्कीमा,: टेबल, कॉलम) बनाउंगा जो' ऑरैक कैश का उपयोग करेगा, इसलिए मुझे बहुत धीमी नहीं होना चाहिए। मुझे केवल यह जांचना होगा कि प्रकार को बिना किसी समस्या के अन्य प्रकारों में परिवर्तित किया जा सकता है या नहीं। – SWilk

+1

@SWilk: प्रकार पुराना सीएलओबी है। यह सिर्फ पाठ है और इसे एक स्ट्रिंग में परिवर्तित किया जाना चाहिए। आपकी क्वेरी में आपको * इस कॉलम के मान से * DEFAULT को प्रतिस्थापित करना चाहिए, और * बाध्य * मान नहीं है क्योंकि डिफ़ॉल्ट मान एक अभिव्यक्ति हो सकता है (जैसे 'trunc (sysdate) + 1') –

+0

अच्छा बिंदु, धन्यवाद। – SWilk

1

मुझे लगता है कि स्पष्ट तरीका उन्हें अपने सम्मिलित करें-बयान में उल्लेख नहीं है। आप डिफॉल्ट मानों को भरने के लिए ट्रिगर्स लिखना शुरू कर सकते हैं लेकिन आप जो लक्ष्य कर रहे हैं उसके लिए यह भारी कवच ​​है।

क्या आपके एप्लिकेशन कोड को पुन: व्यवस्थित करना संभव नहीं है? PHP में, आप बिना किसी गड़बड़ के एक स्वच्छ INSERT-स्टेटमेंट बना सकते हैं, उदा। इस तरह:

<?php 
$insert['column_name1'] = 'column_value1'; 
$insert['column_name2'] = 'column_value2'; 
$insert['column_name3'] = ''; 
$insert['column_name4'] = 'column_value4'; 

// remove null values 
foreach ($insert as $key => $value) { 
    if (is_null($value) || $value=="") { 
    unset($insert[$key]); 
    } 
} 

// construct insert statement 
$statement = "insert into table (". implode(array_keys($insert), ',') .") values (:". implode(array_keys($insert), ',:') .")"; 

// call oci_parse 
$stid = oci_parse($conn, $statement); 

// bind parameters 
foreach ($insert as $key => $value) { 
    oci_bind_by_name($stid, ":".$key, $value); 
} 

// execute! 
oci_execute($stid); 
?> 
+0

और फिर "ओ'नील" मूल्य और बम के रूप में आता है! यदि वास्तव में बाध्य चर (: मान) में परिवर्तित किया जाता है तो यह वास्तव में काम करेगा। वैसे भी, मैं इस पैटर्न से अवगत हूं, लेकिन मैं किसी भी प्रकार के ऑरैक स्टेटमेंट की तलाश में था जो नौकरी करेगा। मैंने सोचा कि ऑरैकल के लिए इसके लिए एक तैयार समाधान हो सकता है। – SWilk

+0

@SWilk आप सही हैं। मेरा उदाहरण बाध्य चर का उपयोग करने के लिए आसानी से संशोधित किया जा सकता है। वास्तव में, मैंने अभी किया। –

0

मैं किसी भी डेटा मैं सम्मिलित करना चाहते हैं के लिए एक डालने कथन का उपयोग करना चाहते हैं, और अगर मूल्यों डाला nulls हैं या नहीं की जाँच करने के लिए परेशान नहीं है।

उस तालिका के लिए डिफ़ॉल्ट मान के साथ अपनी तालिका को परिभाषित करें।

create table myTable 
(
    created_date date default sysdate, 
    ... 
) 
tablespace... 

या किसी मौजूदा तालिका में परिवर्तन: उदाहरण के लिए:

alter table myTable modify(created_date default sysdate); 

अब आप (या mytable का उपयोग कर किसी), मूलभूत मूल्यों के बारे में चिंता के रूप में यह होना चाहिए नहीं है। बस जानते हैं कि इस उदाहरण के लिए, कॉलम अभी भी शून्य है, इसलिए कोई स्पष्ट रूप से एक शून्य डाल सकता है। यदि यह वांछित नहीं है, तो कॉलम को नल भी बनाएं।

संपादित करें: उपर्युक्त मानना ​​पहले से ही किया जा चुका है, आप अपने सम्मिलन कथन में DEFAULT कीवर्ड का उपयोग कर सकते हैं। मैं इसके लिए ट्रिगर्स से बचूंगा।

+0

कॉलम में डिफ़ॉल्ट मान हैं। बात यह है कि जब मैं बाध्य चर शून्य है तो मैं डिफ़ॉल्ट मान डालना चाहता हूं।'tmp_table_tab (aaa, bbb, ccc) मानों (9, 8, nvl (: my_value, DEFAULT)) में डालें ओआरए -00 9 36 गायब अभिव्यक्ति में परिणाम। जबकि 'tmp_table_tab (aaa, bbb, ccc) मान (9, 8, DEFAULT) में डालें, सही ढंग से निष्पादित होगा, यह मेरी आवश्यकता से कुछ और करता है। मैं इसके मूल्य के बारे में भूलना चाहता हूं: my_Value और सभी प्रविष्टियों के लिए एक INSERT कथन का उपयोग करें। – SWilk

+0

ठीक है, अब मैं समझता हूं। दुर्भाग्यवश, आप शायद सभी स्तंभों के लिए एक मास्टर डालने के लिए एक स्पष्ट समाधान खोजने के लिए नहीं जा रहे हैं या नहीं। यदि आप अपने डालने वाले स्टैम को नहीं बदल सकते हैं, तो कौन से कोल्स नल हैं, तो पहले डालने वाला ट्रिगर अगली सबसे अच्छी बात होगी। ध्यान रखें कि यदि कॉलम शून्य से शून्य करने के लिए नहीं बदला जाता है, तो आपको उस कॉलम के डिफ़ॉल्ट मानों का उपयोग करके बाहर करने के लिए ट्रिगर को भी बदलना होगा। (अतिरिक्त रखरखाव ओवरहेड के साथ ही प्रसंस्करण ओवरहेड जोड़ता है)। – tbone

1

प्रदर्शन के लिए बेहतर विकल्प पहला है।

वैसे भी, जैसा कि मैं समझता हूं, आप संशोधन करने में मुश्किल होने के कारण सम्मिलित कॉलम नामों और मानों को दोहराना नहीं चाहते हैं।

INSERT INTO schema.my_table 
    (pk_column, other_column, not_null_column_with_default_value) 
VALUES 
    (:pk_column,:other_column, :not_null_column_with_default_value) 
RETURNING not_null_column_with_default_value 
INTO :insered_value 

यह work with PHP लगता है: एक और विकल्प आप उपयोग कर सकते returning खंड एक अद्यतन के बाद से एक डालने को चलाने के लिए है।

इस के बाद आप insered_value बाँध चर पर null के लिए देख सकते हैं।

UPDATE my_table 
    SET not_null_column_with_default_value = DEFAULT 
WHERE pk_column = :pk_column: 
संबंधित मुद्दे