2008-12-08 15 views
24

मुझे प्राथमिक कुंजी के रूप में एक कॉलम होना चाहिए और दूसरा ऑर्डर नंबर फ़ील्ड ऑटो वृद्धि करने की आवश्यकता है। क्या यह संभव है?क्या एक SQL सर्वर तालिका में दो पहचान कॉलम हो सकते हैं?

संपादित करें: मुझे लगता है कि मैं केवल क्रम संख्या के रूप में एक समग्र संख्या का उपयोग करूंगा। फिर भी धन्यवाद।

+1

SQL सर्वर का कौन सा संस्करण आप उपयोग कर रहे हैं? –

उत्तर

27
CREATE TABLE [dbo].[Foo](
    [FooId] [int] IDENTITY(1,1) NOT NULL, 
    [BarId] [int] IDENTITY(1,1) NOT NULL 
) 

रिटर्न

Msg 2744, Level 16, State 2, Line 1 
Multiple identity columns specified for table 'Foo'. Only one identity column per table is allowed. 

तो, नहीं, तुम दो पहचान कॉलम नहीं हो सकता। आप निश्चित रूप से प्राथमिक कुंजी को ऑटो वृद्धि (पहचान) नहीं बना सकते हैं।

संपादित करें: msdn:CREATE TABLE (Transact-SQL) और CREATE TABLE (SQL Server 2000):

केवल एक पहचान स्तंभ तालिका के अनुसार बनाया जा सकता है।

+1

मैंने कोशिश की लेकिन अक्सर एक सेटिंग बदल दी जा सकती है, इसलिए मैंने सवाल पूछा। –

+0

यह spec द्वारा है। Msdn के लिए जोड़ा गया लिंक देखें। –

0

एसक्यूएल सर्वर में पहचान के रूप में एक से अधिक स्तंभ होना संभव नहीं है।

1

प्राथमिक कुंजी को पहचान कॉलम होने की आवश्यकता नहीं है।

आपके पास दो पहचान कॉलम नहीं हो सकते हैं।

आप क्या आप एक ट्रिगर के साथ चाहते हैं उसके पास कुछ मिल सकता है ...

+0

यह समस्याग्रस्त है। प्राथमिक कुंजी शून्य मानों की अनुमति नहीं देती है। आमतौर पर ऑटो-जेनरेट की गई कुंजियां आवेषण पर छोड़ दी जाती हैं। यहां तक ​​कि यदि आप अपनी प्राथमिक कुंजी उत्पन्न करने के लिए INSTEAD के INSTEAD के साथ ट्रिगर का उपयोग करते हैं, तो यह प्यूक (SQLSEVER2000 पर परीक्षण किया जाएगा) –

+1

@snmcdonald: 2011 वर्ष में SQL Server 2000 का उपयोग न करें। – abatishchev

5

एक पहचान स्तंभ जोड़ें और फिर एक गणना स्तंभ जिसका सूत्र

अब दोनों एक ही समय में भी वृद्धि होगी पहचान स्तंभ का नाम है जोड़ने

3

कोई यह की तुलना में अधिक है करने के लिए संभव नहीं है एक पहचान कॉलम।

एंटरप्राइज़ प्रबंधक आपको पहचान के रूप में> 1 कॉलम सेट करने की अनुमति भी नहीं देता है। जब एक दूसरा कॉलम पहचान

यह भी ध्यान दें कि @@ पहचान खुली कनेक्शन के लिए अंतिम पहचान मान लौटाती है जो एक तालिका के लिए एक से अधिक पहचान कॉलम संभव था।

2
create table #tblStudent 
(
    ID int primary key identity(1,1), 
    Number UNIQUEIDENTIFIER DEFAULT NEWID(), 
    Name nvarchar(50) 
) 

दो पहचान कॉलम संभव नहीं है, लेकिन यदि आप एक अद्वितीय पहचानकर्ता कॉलम का उपयोग करने के लिए स्वीकार करते हैं तो यह कोड भी वही काम करता है। और मूल्यों को सम्मिलित करने के लिए आपको एक अतिरिक्त कॉलम - नाम कॉलम की भी आवश्यकता है।

उदाहरण उपयोग:

insert into #tblStudent(Name) values('Ali') 

select * from #tblStudent 

पी.एस.: NewID() समारोह प्रकार uniqueidentifier का एक अनूठा मूल्य पैदा करता है।

0

मैंने अभी एक कोड बनाया है जो आपको एक ही तालिका में दो पहचान डालने की अनुमति देगा।मुझे मामले में आप के साथ साझा करते हैं यह मदद करता है:

create trigger UpdateSecondTableIdentity 
On TableName For INSERT 
as 
update TableName 
set SecondIdentityColumn = [email protected]@IDENTITY 
where ForstId = @@IDENTITY; 

धन्यवाद,

16

आप एसक्यूएल सर्वर का उपयोग करते हैं 2012

--Create the Test schema 
CREATE SCHEMA Test ; 
GO 

-- Create a sequence 
CREATE SEQUENCE Test.SORT_ID_seq 
    START WITH 1 
    INCREMENT BY 1 ; 
GO 

-- Create a table 
CREATE TABLE Test.Foo 
    (PK_ID int IDENTITY (1,1) PRIMARY KEY, 
    SORT_ID int not null DEFAULT (NEXT VALUE FOR Test.SORT_ID_seq)); 
GO 

INSERT INTO Test.Foo VALUES (DEFAULT) 
INSERT INTO Test.Foo VALUES (DEFAULT) 
INSERT INTO Test.Foo VALUES (DEFAULT) 

SELECT * FROM Test.Foo 

-- Cleanup 
--DROP TABLE Test.Foo 
--DROP SEQUENCE Test.SORT_ID_seq 
--DROP SCHEMA Test 

http://technet.microsoft.com/en-us/library/ff878058.aspx

डिफ़ॉल्ट मान के साथ दूसरे स्तंभ के लिए अनुक्रम का उपयोग कर सकते
+0

अच्छा सुझाव, केवल समस्या तालिका का छंटनी है। – GoldBishop

+0

मुझे यकीन नहीं है कि ट्रंकेशन एक समस्या है, यदि आप [अनुक्रम रीसेट करना चाहते हैं] (https://msdn.microsoft.com/en-us/library/ff878572.aspx#code-snippet-7), तो आप कर सकते हैं आसानी से ऐसा करें – benkevich

+0

हां लेकिन पहचान पहचानकर्ता के विपरीत, आपको या तो अनुक्रम छोड़ना होगा और फिर पुन: जोड़ना होगा या अनुक्रम के लिए प्रारंभ को फिर से परिभाषित करना होगा। विकास और/या परीक्षण के लिए, अनुक्रम एक आदर्श कार्यान्वयन नहीं है। एक बार जब आप देव/परीक्षण चरण से पहले हो जाते हैं, तो यह एक व्यापक रूप से उपयोगी कार्यान्वयन है। देव-चरण – GoldBishop

-1

एक कामकाज एक आईएनएसईआरटी ट्रिगर बनाने के लिए होगा जो काउंटर को बढ़ाता है।

तो मेरे पास एक सारणी है जिसमें एक पहचान कॉल है: applicationstatusid। इसकी प्राथमिक कुंजी भी है। मैं एक और कॉल बढ़ाने के लिए ऑटो कॉल करना चाहता हूं: applicationnumber

तो यह वह ट्रिगर है जिसे मैं लिखता हूं।

create trigger [applicationstatus_insert] on [ApplicationStatus] after insert as 
     update [Applicationstatus] 
     set [Applicationstatus].applicationnumber =(applicationstatusid+ 4000000) 
     from [Applicationstatus] 
     inner join inserted on [applicationstatus].applicationstatusid = inserted.applicationstatusid 
+0

के दौरान बस एक पिटा नीचे अनुक्रम बनाएं जिससे आप एक डिफ़ॉल्ट मान कर सकें जो स्वत: वृद्धि करता है। 2012 से पहले आप एक ऐसे फ़ंक्शन का उपयोग कर सकते हैं जो किसी तालिका में मूल्य बढ़ाता है और इसे वापस करता है (जैसा कि आपने अपने उत्तर में किया है)। और यह एक कॉलम के लिए एक डिफ़ॉल्ट मान हो सकता है। ट्रिगर्स से बचा जाना चाहिए। – TamusJRoyce

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