2008-11-27 27 views
7

ऐसा लगता है कि यह ऐसा मुद्दा है जो SQL/डेटाबेस विकास के साथ हर समय फसल करेगा, लेकिन फिर मैं इन सबके लिए नया हूं, इसलिए मेरी अज्ञानता को क्षमा करें।एसक्यूएल संबंधित तालिकाओं में सम्मिलित

CREATE TABLE [dbo].[Tracks](
    [TrackStringId] [bigint] NOT NULL, 
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [Time] [datetime] NOT NULL, 
CONSTRAINT [PK_Tracks] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
     IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
     ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Tracks] CHECK CONSTRAINT [FK_Tracks_AudioStreams] 
GO 

ALTER TABLE [dbo].[Tracks] WITH CHECK ADD CONSTRAINT 
[FK_Tracks_TrackStrings]  FOREIGN KEY([TrackStringId]) 
REFERENCES [dbo].[TrackStrings] ([Id]) 
GO 

ALTER TABLE [dbo].[Tracks] CHECK CONSTRAINT [FK_Tracks_TrackStrings] 
GO 

और

CREATE TABLE [dbo].[TrackStrings](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [String] [nvarchar](512) NOT NULL, 
CONSTRAINT [PK_Strings] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
     IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
     ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

मैं पटरियों तालिका में एक नई प्रविष्टि सम्मिलित करना चाहते हैं:

2 टेबल है। इसमें ट्रैकस्ट्रिंग टेबल में एक नई प्रविष्टि भी शामिल होगी, और यह सुनिश्चित करना होगा कि ट्रैक में विदेशी कुंजी कॉलम ट्रैकस्ट्रिंगिड ट्रैकस्ट्रिंग में नई प्रविष्टि को इंगित करता है। इसे प्राप्त करने का सबसे प्रभावी माध्यम क्या है?

उत्तर

10

सबसे पहले, कॉलम सूची से प्राथमिक कुंजी कॉलम को छोड़कर, TrackStrings में डालें। यह IDENTITY कॉलम का आह्वान करता है जो स्वचालित रूप से एक मान उत्पन्न करता है।

INSERT INTO [dbo].[TrackStrings] ([String]) 
    VALUES ('some string'); 

दूसरा, Tracks में डालने और उसके TrackStringId समारोह SCOPE_IDENTITY() है, जो हाल ही में अपने वर्तमान क्षेत्र में एक IDENTITY स्तंभ द्वारा उत्पन्न मान देता है के रूप में निर्दिष्ट करें।

INSERT INTO [dbo].[Tracks] ([TrackStringId], [Time]) 
    VALUES (SCOPE_IDENTITY(), CURRENT_TIMESTAMP()); 
0

प्राथमिक तालिका में सबसे पहले डालें।

INSERT INTO trackstrings VALUES('myvalue') 

अगला पहचान प्राप्त करें। यह विधि इस बात पर निर्भर करती है कि आप इसे 1 कथन या संग्रहीत प्रक्रिया या किसी अन्य विधि में कर रहे हैं या नहीं। मैं 1 कथन मानूंगा इसलिए मैं पहचान विशेष चर के साथ बस डालेगा।

INSERT INTO tracks VALUES(@@IDENTITY, getdate()) 

ऐसा कुछ आपके सटीक परिदृश्य के आधार पर करना चाहिए। कुंजी @@ पहचान वैरिएबल है। आपके द्वारा उपयोग किए जा रहे कनेक्शन के लिए इसमें अंतिम सम्मिलित पहचान मान है। यह तालिका विशिष्ट नहीं है, यह कनेक्शन जीवनकाल के दौरान सबसे हाल ही की पहचान डाली गई है।

+4

@@ पहचान यह करने का सबसे अच्छा तरीका नहीं है। SCOPE_IDENTITY() अधिक सुरक्षित है। यदि कोई ट्रिगर है जो ट्रैकस्ट्रिंग में डालने पर कुछ काम करता है और यह पहचान के साथ तालिका में प्रवेश करता है, तो आपको ट्रिगर से पहचान मिल जाएगी, न कि मूल तालिका। –

+1

कूल, जानकारी के लिए धन्यवाद। मुझे अंतर का एहसास नहीं हुआ। – palehorse

+0

कृपया यह जानने के लिए पढ़ें कि @@ इस मामले में पहचान का उपयोग क्यों नहीं किया जाना चाहिए: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve- अंतिम डाला-पहचान-ऑफ-द रिकॉर्ड / – hidden

5

आप SQL सर्वर 2005 या बाद में उपयोग कर रहे हैं और एक भी INSERT में रिकॉर्ड का एक बहुत डालने रहे हैं, तो आप के लिए "फिर haveing ​​के बिना दूसरे में पहली डालने से पहचान का उपयोग करने के OUTPUT या OUTPUT INTO विकल्पों here पर गौर कर सकते -फिंड "पंक्तियों को सभी IDENTITY मान प्राप्त करने के लिए।

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