IDENTITY_INSERT को बंद पर सेट किए जाने पर तालिका 'तालिका' में पहचान कॉलम के लिए स्पष्ट मूल्य नहीं डाला जा सकता है


361

नीचे दी गई त्रुटि है जब मैं निम्नलिखित स्क्रिप्ट निष्पादित करता हूं। त्रुटि के बारे में क्या है, और इसे कैसे हल किया जा सकता है?

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

त्रुटि:

सर्वर: एमएसजी 544, लेवल 16, स्टेट 1, लाइन 1

IDENTITY_INSERT को बंद पर सेट किए जाने पर तालिका 'तालिका' में पहचान कॉलम के लिए स्पष्ट मूल्य नहीं डाला जा सकता है।



2
@ हिमांशुअहुजा यह प्रश्न (१३३४०१०) १० वर्ष पुराना है, जिसे आपने केवल १ से जोड़ा है। यदि कुछ भी है, तो नया एक डुप्लिकेट है। लेकिन करीब से देखने पर आपको पता चलेगा कि वे अलग-अलग हैं (नया वाला IDENTITY_INSERT को ON बताता है)। कृपया अपना ध्वज / टिप्पणी हटा दें।
जस्सी

@ केसी करेंगे, जैसा कि मुझे याद नहीं है जब मैंने इस ध्वज को पोस्ट किया था
हिमांशु आहूजा

जवाबों:


467

आप इसके लिए मान सम्मिलित कर रहे हैं OperationIdजो एक पहचान स्तंभ है।

आप इस तरह तालिका में पहचान सम्मिलित चालू कर सकते हैं ताकि आप अपने स्वयं के पहचान मूल्यों को निर्दिष्ट कर सकें।

SET IDENTITY_INSERT Table1 ON

INSERT INTO Table1
/*Note the column list is REQUIRED here, not optional*/
            (OperationID,
             OpDescription,
             FilterID)
VALUES      (20,
             'Hierachy Update',
             1)

SET IDENTITY_INSERT Table1 OFF 

14
+1 वास्तव में - स्पष्ट आवेषण अनुमति देने के लिए विकल्प को चालू पर है, तो सम्मिलित करें, तो विकल्प को चालू बंद फिर
marc_s

13
यदि आप वास्तव में अपना मान पहचान स्तंभ में जोड़ना चाहते हैं, तो यह आपका उत्तर है, लेकिन दूसरी ओर, किसी ने कॉलम को सम्मिलित करने के लिए स्वयं बढ़ाकर सेट किया है। उस स्थिति में तालिका अगले नि: शुल्क नंबर का ट्रैक रखेगी, और आपको स्वयं ऑपरेशन करने की आवश्यकता नहीं है। नई आईडी SELECT SCOPE_IDENTITY () द्वारा प्राप्त की जा सकती है।
हकन विन्थर

15
खतरनाक अभ्यास, यह बताए बिना इसका उपयोग करने की सलाह नहीं देते कि यह एक खराब विचार क्यों है। बहुत घटिया जवाब।
HLGEM

7
अच्छा जवाब, लेकिन सुनिश्चित करें कि आप जानते हैं कि आप क्या कर रहे हैं। मेरे लिए यह डेटा के साथ एक डेटाबेस बीज के लिए उपयोगी है, जहां विदेशी कुंजियों को अलग-अलग तालिकाओं से मेल खाने की आवश्यकता होती है
बेरी

2
@UlyssesAlves: यह विकल्प केवल एक ही तालिका डेटाबेस-वाइड के लिए चालू किया जा सकता है - इसलिए यदि आप इसे एक तालिका के लिए छोड़ देते हैं, तो आप इसे किसी अन्य तालिका के लिए उपयोग करने में सक्षम नहीं होंगे। इसके अलावा: यह एक विकल्प नहीं है जिसे छोड़ दिया जाना चाहिए - डिफ़ॉल्ट रूप से, आपको SQL सर्वर को पहचान मान को संभालने देना चाहिए - यह केवल बहुत विशिष्ट मामलों के लिए एक अंतिम उपाय के रूप में है - सामान्य प्रयोजन के विकल्प को चालू या बंद करने के लिए नहीं आपका अवकाश ...
marc_s

61

ऑपरेशनआईडी के लिए मूल्य मत डालें क्योंकि यह स्वचालित रूप से उत्पन्न होगा। इसे इस्तेमाल करे:

Insert table(OpDescription,FilterID) values ('Hierachy Update',1)

5
यह सही उत्तर है यदि आप स्वतः ऑपरेशन जनरेट करना चाहते हैं
१५'१५

46

यदि आपको SQL सर्वर पर यह त्रुटि मिल रही है तो इस क्वेरी को चलाएं-

SET IDENTITY_INSERT tableName ON

यह डेटाबेस की केवल एक तालिका काम कर रहा है जैसे यदि तालिका का नाम छात्र है तो क्वेरी इस तरह दिखती है SET IDENTITY_INSERT student ON

यदि आपको अपने वेब एप्लिकेशन पर यह त्रुटि हो रही है या आप इकाई ढांचे का उपयोग कर रहे हैं, तो पहले SQL सर्वर पर इस क्वेरी को चलाएं और अपने इकाई मॉडल को.edmx file अपडेट करें ( ) और अपने प्रोजेक्ट का निर्माण करें और यह त्रुटि हल हो जाएगी।


यह ईएफ के साथ मेरे एमवीसी वेब ऐप में मामला था और मैंने बस .edmx से मॉडल को हटा दिया और डेटाबेस से फिर से जोड़ा (राइट क्लिक अपडेट मॉडल) और फिर मेरे लिए काम करने वाले प्रोजेक्ट को साफ और पुनर्निर्माण किया। शुक्रिया @ उमंग पटवा
ईशर खानल

42

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

आप एक पहचान क्षेत्र में एक मूल्य डालने की कोशिश क्यों कर रहे हैं?


5
किस तरह से प्रभावित होता है? यह एक सत्र स्तर विकल्प है न कि तालिका की संपत्ति।
मार्टिन स्मिथ

5
दो डेटाबेस के बीच एक समय डेटा सिंक जो आप रिश्तों को बनाए रखना चाहते हैं। उदाहरण के लिए मैंने इसका उपयोग अपने उत्पाद स्कीमा को एक डेटाबेस से दूसरे डेटाबेस में खींचने के लिए किया
NSjonas

1
@ सोंसोनस, कि सेट आइडेंटिटी _insert table1 ON का एक अच्छा उपयोग होगा। मैंने ऐसे लोगों को देखा है, जो इसका उपयोग उस एप्लिकेशन से कुछ करने के लिए करना चाहते थे जो कि एक साधारण इंसर्ट के साथ किया जाना चाहिए और पहचान को उत्पन्न करने की अनुमति देता है।
HLGEM

2
सवाल यह है कि "क्या आप बता सकते हैं कि यह क्या है और इसे कैसे हल किया जा सकता है?" आपका उत्तर एक टिप्पणी है जो समस्या का समाधान करने वाले उचित उत्तर के बजाय चेतावनी और एक अन्य प्रश्न उठाती है।
गुणवत्ता कैटेलिस्ट

हाँ प्राथमिक कुंजी में मूल्य नहीं डालें।
doflamingo

22

त्रुटि के बिना INSERT रिकॉर्ड के मूल रूप से 2 अलग-अलग तरीके हैं:

1) जब IDENTITY_INSERT बंद है। प्राथमिक कुंजी "आईडी" वर्तमान में नहीं होनी चाहिए

2) जब IDENTITY_INSERT चालू होता है। प्राथमिक कुंजी "आईडी" वर्तमान में होना चाहिए

निम्न तालिका से निम्न उदाहरण के अनुसार एक पहचान प्राथमिक कुंजी के साथ बनाया गया:

CREATE TABLE [dbo].[Persons] (    
    ID INT IDENTITY(1,1) PRIMARY KEY,
    LastName VARCHAR(40) NOT NULL,
    FirstName VARCHAR(40)
);

1) पहले उदाहरण में, आप IDENTITY_INSERT के बंद होने पर एक त्रुटि प्राप्त किए बिना तालिका में नए रिकॉर्ड डाल सकते हैं। PRIMARY KEY "ID" जरूरी नहीं कि "INSERT INTO" स्टेटमेंट्स से PRESENT निकाला जाए और एक यूनिक आईडी वैल्यू अपने आप जुड़ जाए । यदि ID इस मामले में INSERT से मौजूद है, तो आपको त्रुटि मिलेगी "तालिका में स्तंभ की पहचान के लिए स्पष्ट मूल्य सम्मिलित नहीं किया जा सकता है ..."

SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE'); 
INSERT INTO Persons (FirstName,LastName) 
VALUES ('JOE','BROWN');

टेबल [Dbo] के बाहर [लोग] होंगे:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2) दूसरे उदाहरण में, जब IDENTITY_INSERT चालू होता है, तो आप एक त्रुटि प्राप्त किए बिना तालिका में नए रिकॉर्ड सम्मिलित कर सकते हैं। PRIMARY KEY "ID" "INSERT INTO" विवरण से तब तक जारी रहती है जब तक ID मान मौजूद नहीं होता है : यदि ID इस मामले में INSERT से मौजूद नहीं है, तो आपको त्रुटि मिलेगी। स्पष्ट मान होना चाहिए पहचान कॉलम तालिका के लिए निर्दिष्ट ... "

SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE'); 
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK'); 

टेबल [Dbo] के बाहर [लोग] होंगे:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN

2
प्लस के लिए वास्तव में समझा कि झंडा कैसे काम करता है। मेरा दिन सुपरमैन
जॉन

20

उस तालिका के लिए अपनी इकाई में, DatabaseGeneratedकॉलम के ऊपर वह विशेषता जोड़ें जिसके लिए पहचान सम्मिलित है:

उदाहरण:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }

ठीक है, सच है, लेकिन मैं वास्तव में ईएफ :-) के लिए एक जवाब चाहता था फिर भी, यह ओपी के लिए उपयुक्त नहीं है, जिन्होंने कभी भी इस्तेमाल नहीं किया, या शायद सामना करना पड़ा, ईएफ।
शुभांक

किसी भी मामले में, उत्तर गलत है। मेरी इकाई पहले से निर्दिष्ट है DatabaseGeneratedOption.Identity, और मुझे अभी भी त्रुटि मिलती है। यह मेरी अपनी गलती है, मैं अपने वेब पेज पर उन्हें एक-दूसरे से अलग करने के लिए नई पंक्तियों में छद्म-आईडी लगा रहा हूं, और मुझे उम्मीद है कि insertपर्याप्त होने से पहले बस उन्हें शून्य करना होगा ।
शुभ अंक

13

आप उदाहरण के लिए इस कथन का उपयोग कर सकते हैं यदि आपकी तालिका का नाम स्कूल है । प्रविष्टि करने से पहले सुनिश्चित करें कि आइडेंटी_इन्टर चालू है और क्वैरी टर्न आइडेंटिटी / इनसर्ट बंद करने के बाद सेट किया गया है

SET IDENTITY_INSERT School ON
/*
  insert query
  enter code here
*/
SET IDENTITY_INSERT School OFF

1
क्या आप अपने उत्तर पर थोड़ा विस्तार कर सकते हैं ताकि कमांड का स्पष्टीकरण शामिल हो, यह क्यों काम करता है और इसका क्या प्रभाव पड़ता है?
gareththegeek

@gareththegeek हाँ इसके पहचान कॉलम के लिए आपको डेटा सम्मिलित करने के लिए इसे सुनिश्चित करना होगा।

6

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

<changeSet id="CREATE_GROUP_TABLE" >
    <createTable tableName="GROUP_D">
        <column name="GROUP_ID" type="INTEGER" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="INSERT_UNKNOWN_GROUP" >
    <insert tableName="GROUP_D">    

        <column name="GROUP_ID" valueNumeric="-1"/>
 ...
    </insert>
</changeSet>

4

आपकी क्वेरी में पूर्व-उल्लेखित ऑपरेशनआईड है जो वहाँ नहीं होना चाहिए क्योंकि यह स्वत: संचालित है

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

तो आपकी क्वेरी होगी

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)

3

एक अन्य स्थिति यह जांचने के लिए है कि प्राथमिक कुंजी आपकी कक्षाओं के समान नाम है जहां एकमात्र अंतर यह है कि आपकी प्राथमिक कुंजी में 'आईडी' संलग्न है या प्राथमिक कुंजी पर [कुंजी] निर्दिष्ट करने के लिए जो संबंधित नहीं हैं। कक्षा का नाम है।


2
  1. यह तब होता है जब आपके पास एक (प्राथमिक कुंजी) कॉलम होता है जो SQL में सत्य की पहचान करने के लिए सेट नहीं होता है और आप इसके साथ स्पष्ट मूल्य पास नहीं करते हैं। यह पहली पंक्ति लेगा, फिर आप दूसरी पंक्ति सम्मिलित करने में सक्षम नहीं होंगे, त्रुटि पॉप हो जाएगी। इसे [DatabaseGenerated(DatabaseGeneratedOption.Identity)]अपने PrimaryKey कॉलम में कोड की इस लाइन को जोड़कर ठीक किया जा सकता है और सुनिश्चित करें कि इसका सेट डेटा प्रकार int पर हो । यदि स्तंभ प्राथमिक कुंजी है और SQL में Isidentity को सत्य करने के लिए सेट है, तो इस कोड की कोई आवश्यकता नहीं है[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  2. यह तब भी होता है जब यू में एक कॉलम होता है जो प्राथमिक कुंजी नहीं है, SQL में जो कि पहचान के लिए सही है, और आपके EF में आपने कोड की इस पंक्ति को नहीं जोड़ा है [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

धन्यवाद यह ठीक iv घंटे के लिए देख रहे थे।
विशव प्रेमलल

2

सबसे अच्छा समाधान एनोटेशन का उपयोग करना है GeneratedValue(strategy = ...), अर्थात

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;

यह कहता है, कि यह कॉलम IDENTITY रणनीति का उपयोग करके डेटाबेस द्वारा बनाया गया है और आपको इसकी देखभाल करने की आवश्यकता नहीं है - डेटाबेस इसे करेगा।


1

यदि आप सीक्वल-टाइपस्क्रिप्ट npm के साथ एक sql- सर्वर का उपयोग करते समय यह समस्या आ रही @AutoIncrementहै, तो आईडी कॉलम में जोड़ना सुनिश्चित करें:

  @PrimaryKey
  @AutoIncrement
  @Column
  id!: number;

0

और यदि आप कनेक्ट करने के लिए Oracle SQL डेवलपर का उपयोग कर रहे हैं, तो जोड़ना / sqldev याद रखें : stmt /

/ sqldev: stmt / set identity_insert टेबल पर;


स्पष्ट रूप से यह मामला नहीं है, प्रश्न में "sql-server" टैग है
DanielV

0

मुझे यकीन नहीं है कि "इन्सर्ट टेबल" का उपयोग क्या है, लेकिन यदि आप कुछ मान डालने की कोशिश कर रहे हैं, तो कोशिश करें:

Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);

मेरे पास एक ही त्रुटि संदेश आया था, लेकिन मुझे लगता है कि यह काम करना चाहिए। जब तक यह एक प्राथमिक कुंजी है, तब तक आईडी को स्वतः-वृद्धि बढ़ाना चाहिए।


0

मैं डेटाबेस में कुछ भी जोड़ना चाहता हूं हर बार एक नई वस्तु बनाकर मैंने इस समस्या को हल किया।


0

ध्यान दें कि यदि आप प्रत्येक पंक्ति को बंद कर रहे हैं ;, तो SET IDENTITY_INSERT mytable ONकमांड निम्नलिखित पंक्तियों के लिए नहीं होगी।

जैसे
एक क्वेरी

SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');

त्रुटि देता है
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

लेकिन इस तरह एक क्वेरी काम करेगी:

SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;

ऐसा लगता है कि SET IDENTITY_INSERTकमांड केवल एक लेन-देन के लिए है, और यह लेनदेन ;के अंत का संकेत देगा।


-1

यदि आप इंटरफ़ेस का उपयोग कर रहे हैं और जेनेरिक तरीके से savechanges की विधि को लागू करते हैं तो गैर-टाइप किए गए DBContext या DBSet का उपयोग करने से समस्या

यदि यह आपका मामला है, तो मैं उदाहरण के लिए डीबीसीऑनटेक्स को दृढ़ता से टाइप करने का प्रस्ताव करता हूं

MyDBContext.MyEntity.Add(mynewObject)

तब .Savechangesकाम करेगा


-1

बस अपनी .dbml फ़ाइल में खींची गई तालिकाओं को हटा दें और उन्हें फिर से खींचें। फिर स्वच्छ समाधान> समाधान का निर्माण करें> समाधान बनाएं।

Thats मेरे लिए क्या काम किया।

मैंने अपने दम पर तालिका नहीं बनाई, मैं VS और SSMS का उपयोग कर रहा था, मैंने ASP.NET पहचान के लिए इस लिंक का अनुसरण किया: https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/ जोड़ने-aspnet-पहचान करने के लिए एक खाली या मौजूदा-वेब-रूपों-परियोजना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.