2010-10-06 5 views
17

मैं इस पर अपने बालों को चीरने के लिए तैयार हूं। मैं एमएस एसक्यूएल के लिए काफी नया हूं, और कहीं भी इसी तरह की पोस्ट नहीं देखी है।एसक्यूएल सर्वर, प्राथमिक कुंजी फ़ील्ड में शून्य नहीं डाल सकता है?

जब मैं इस तरह एक बयान करने की कोशिश:

स्तंभ 'iRawMatTestCharacteristicId', तालिका 'इंट्रानेट में Null मूल्य सम्मिलित नहीं कर सकते:

INSERT INTO qcRawMatTestCharacteristic 
VALUES(NULL, 1,1,1,1,1,1,1,'','','', GETDATE(), 1) 

मैं निम्नलिखित मिलता है। dbo.qcRawMatTestCharacteristic '; कॉलम नल की अनुमति नहीं देता है। INSERT विफल रहता है।

मैं त्रुटि को समझता हूं, लेकिन शून्य मान मेरे प्राथमिक क्षेत्र के लिए एक int डेटा प्रकार के साथ है।

कोई विचार !?

+1

ठीक है मुझे स्पष्टीकरण देना चाहिए। मैं सिर्फ एक ऑटो-निर्माण प्राथमिक कुंजी चाहता हूँ। MySQL में एक पूर्ण मूल्य मुझे यह प्रभाव देगा। यदि मैं ऊपर के समान INSERT कथन का उपयोग करता हूं, तो मेरे फ़ील्ड निर्दिष्ट करें और प्राथमिक कुंजी छोड़ दें। मुझे समान त्रुटि मिली। – Nick

+1

@Nick: SQL सर्वर में उस कॉलम को काम करने के लिए 'INT पहचान' के रूप में परिभाषित किया जाना चाहिए। कुंजी 'पहचान' भाग है - आपको अपने पीके कॉलम पर परिभाषित करने की आवश्यकता है, अन्यथा यह –

+0

पर काम नहीं करेगा। अब मुझे यह मिल गया है। बहुत बहुत धन्यवाद। मुझे पता है कि डेटाबेस कैसे रिलेशनल काम करते हैं। लेकिन आपने मेरे एमएस एसक्यूएल प्रश्न का उत्तर दिया। :) – Nick

उत्तर

7

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

Insert into (field1, field2, field3) 
values 
(value1, value2, value3) 

इस का कारण यह सुनिश्चित करता है कि स्तंभ क्रम आप के रूप में एक एसक्यूएल व्यवस्थापक स्तंभ संशोधित कर सकते हैं के लिए क्या विकसित है आदेश। यह भी आप प्राथमिक कुंजी उदाहरण

CREATE TABLE [dbo].[foo](
    [fooid] [int] IDENTITY(1,1) NOT NULL, 
    [name] [varchar](50) NULL, 
CONSTRAINT [PK_foo] PRIMARY KEY 
(
     [fooid] ASC 
) 

का मूल्य निर्दिष्ट करने के लिए बाहर के साथ एक पहचान प्राथमिक कुंजी के साथ एक पंक्ति को सम्मिलित करने के अब मेरी डालने बयान

Insert into foo (name) 
values 
("John") 

तालिका में परिणाम होगा सरल है की अनुमति देता है किसी भी रिलेशनल डेटाबेस में

1, "John" 
46

प्राथमिक कुंजी शून्य होने के लिए अनुमति नहीं है - यह मुख्य, मौलिक ग में से एक है प्राथमिक कुंजी की विशेषताएं।

देखें: SQL by Design: how to Choose the primary key

कभी अशक्त
कोई प्राथमिक कुंजी मान शून्य हो सकता है, और न ही आप के लिए कुछ भी कर सकते हैं प्राथमिक कुंजी अशक्त प्रस्तुत करना। यह मॉडल का एक अनियंत्रित नियम है जो संबंधपरक डेटाबेस प्रबंधन प्रणाली (RDBMS) डिज़ाइन और SQL सर्वर के ANSI द्वारा समर्थित है।

अद्यतन: ठीक है, तो आप SQL सर्वर में एक "स्वत: वेतन वृद्धि" प्राथमिक कुंजी चाहते हैं।

आप अपने CREATE TABLE बयान में एक INT पहचान के रूप में यह निर्धारित करने होंगे:

CREATE TABLE dbo.YourTable(ID INT IDENTITY, col1 INT, ..., colN INT) 

और उसके बाद जब आप एक सम्मिलित करते हैं, आप स्पष्ट रूप से स्तंभ सम्मिलित करने के लिए निर्दिष्ट करने की आवश्यकता है, लेकिन सिर्फ निर्दिष्ट नहीं करते आप तालिका पहले से बनाए जाने के बाद यह करने के लिए चाहते हैं

INSERT INTO dbo.YourTable(col1, col2, ..., colN) -- anything **except** `ID`  
VALUES(va1l, val2, ..., valN) 

, आप SQL सर्वर प्रबंधन स्टूडियो में ऐसा कर सकते हैं: - उस सूची में "ID" कॉलम तो एसक्यूएल सर्वर उचित मूल्य स्वतः खोजने संभाल लेंगे टेबल डिजाइनर:

alt text

+2

सच नहीं है, MySQL करता है। – Nick

+2

+1 (निश्चित उत्तर)। पूर्णता के लिए: 'अद्वितीय 'कुंजी * * आमतौर पर' शून्य 'मान (' प्राथमिक' नहीं कर सकते हैं) कर सकते हैं। – ChristopheD

+6

@ निक: MySQL पर शर्म की बात है!यह स्पष्ट रूप से संबंध मॉडल –

4

आप शायद नहीं है autoincrement अपने पूर्णांक प्राथमिक कुंजी पर सेट (आप जोड़ना भूल गया)।

2

आप केवल 1 अद्वितीय पंक्ति के लिए शून्य के बजाय 0 का उपयोग कर सकते हैं, पीके के लिए शून्य संभव नहीं है। या आप पीके क्षेत्र का उपयोग कर सकते हैं और ऑटो वृद्धि पीके क्षेत्र

3

प्राथमिक कुंजी को शून्य मान स्वीकार नहीं करना चाहिए। आप प्राथमिक कुंजी फ़ील्ड में शून्य मान क्यों डाल रहे हैं? प्राथमिक कुंजी फ़ील्ड में एक गैर-शून्य, अद्वितीय मूल्य होना चाहिए तालिका में आपके प्रत्येक रिकॉर्ड अद्वितीय

+0

पर उपलब्ध है * ऑटो-वृद्धि के लिए, भले ही मैं सम्मिलित बहस से बाहर निकलता हूं। मुझे समान त्रुटि मिली। – Nick

2

मान लें कि आपके पास अपनी प्राथमिक कुंजी के लिए एक ऑटोइनक्रिकमेंट फ़ील्ड है, आपको अपनी डालने पर फ़ील्ड सूची शामिल करने की आवश्यकता होगी और उस फ़ील्ड के लिए कोई मान नहीं डालना चाहिए

INSERT INTO qcRawMatTestCharacteristic 
(Answer1,Answer2,...SomeDateField) 
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1) 
2

मैं अपने असली मुद्दा यह सोचते कर रहा हूँ यह है कि क्या आप वाकई इतना है कि पी ऑटो सही से भर जाता है कि कैसे एक डालने के बयान लिखने के लिए नहीं कर रहे हैं? तुम्हें पता है, खेतों आप के लिए मूल्यों को स्थापित कर रहे हैं नाम के लिए की जरूरत है यह लगता है कि आप उन सभी को है, लेकिन अभी की तरह सेट किया पी के क्षेत्र सिर्फ बाहर करने के लिए कोशिश कर रहे हैं:

INSERT INTO someTable 
(fieldName1, fieldName2) 
VALUES(1,1) 

कहाँ sometable तीन क्षेत्रों के साथ एक टेबल है। पीके, फ़ील्डनाम 1, और फ़ील्डनाम 2। आपको यह सुनिश्चित करने की भी आवश्यकता है कि पीके फ़ील्ड पर पहचान संपत्ति सत्य पर सेट हो।

0

यदि आपके पास पहचान कॉलम है, तो आपको इसे सम्मिलित कथन में निर्दिष्ट करने की आवश्यकता नहीं है।

INSERT INTO qcRawMatTestCharacteristic 
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1) 

हालांकि, अगर आप एक प्राथमिक कुंजी है कि एक पहचान स्तंभ नहीं है, तो आप यह निर्दिष्ट करने के लिए, क्योंकि अन्यथा यह गैर-व्यर्थ कर रहे हैं डिफ़ॉल्ट रूप से एक अशक्त और प्राथमिक कुंजी डालने की कोशिश करता हूँ की क्या ज़रूरत है ।

संबंधित मुद्दे