2011-10-22 12 views
11
साथ डालने के बाद तालिका ID प्राप्त

एक तालिका में डालने और फिर वापस ताकि मैं एक और तालिका में सम्मिलित कर सकते आईडी प्राप्त करने के लिए मेरे सामान्य प्रक्रिया MSSQL में इस तरह है:ColdFusion और MySQL

DECLARE @transactionKey uniqueidentifier 
SET @transactionKey = NEWID() 

INSERT INTO transactions(transactionKey, transactionDate, transactionAmount) 
    VALUES(@transactionKey, '#transactionDate#', '#transactionAmount#') 

DECLARE @transactionID int 
SELECT @transactionID = transactionID 
    FROM transactions 
    WHERE transactionKey = @transactionKey 


INSERT INTO transactionItems(transactionID, itemID, itemAmount) 
    VALUES(@transactionID, '#itemID#', '#itemAmount#') 


SELECT @transactionID as transactionID 

मेरा प्रश्न है 2 भागों सबसे पहले, यह करने का यह सबसे अच्छा तरीका है? मैंने पढ़ा है कि एक मौका है कि GUID मुझ पर बदलता है और मैं दूसरी तालिका में एक अवैध GUID के साथ समाप्त होता हूं। मुझे लगता है कि इसकी संभावना बहुत पतली है और मैं कई वर्षों से विभिन्न परियोजनाओं पर ऐसा कर रहा हूं और कभी भी कोई समस्या नहीं आई है।

मेरे प्रश्न का दूसरा भाग MySQL में इस काम की तरह कुछ करता है? मैं MySQL का उपयोग कर एक नई परियोजना पर काम करना शुरू कर रहा हूं और मुझे यह सुनिश्चित करने का सबसे अच्छा तरीका बिल्कुल यकीन नहीं है। मैंने आमतौर पर केवल अतीत में एमएसएसक्यूएल पर काम किया है।

मैं इस नई परियोजना पर CF9 और MySQL का उपयोग कर रहा हूं।

इस पर कोई मदद महान होगी।

अग्रिम धन्यवाद।

+0

पुन: * मैंने पढ़ा है कि एक मौका है कि GUID मुझ पर बदलता है * आपने इसे कहां पढ़ा? "परिणाम" विशेषता के लिए – Leigh

उत्तर

23

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

भाग 2: ColdFusion, कई चीजों की तरह, बनाता है बहुत आसान एक नव डाला रिकार्ड के लिए प्राथमिक कुंजी हो रही - भले ही आप ऑटो वेतन वृद्धि चाबियाँ, GUIDs या Oracle की ROWNUM की तरह कुछ का उपयोग कर रहे हैं। यह एमएसएसएलएल या माईएसक्यूएल सहित एडोब कोल्डफ्यूजन द्वारा समर्थित लगभग हर डेटाबेस पर काम करेगा। एकमात्र अपवाद डाटाबेस का संस्करण है - उदाहरण के लिए, MySQL 3 इसका समर्थन नहीं करेगा; हालांकि, MySQL 4+ होगा।

<cfquery result="result"> 
    INSERT INTO myTable (
     title 
) VALUES (
    <cfqueryparam value="Nice feature!" cfsqltype="cf_sql_varchar"> 
) 
</cfquery> 

<--- get the primary key of the inserted record ---> 
<cfset NewPrimaryKey = result.generatedkey> 

CF9 + के रूप में, आप नई आईडी (किसी भी डेटाबेस के लिए) का उपयोग कर सकते सामान्य कुंजी नाम का उपयोग:

result.GENERATEDKEY // All databases 

CF8 के लिए, विभिन्न डेटाबेस परिणाम मूल्य के भीतर विभिन्न कुंजी होगा। cfquery documentation से कॉपी करने में सहायता के लिए यहां एक साधारण तालिका दी गई है।

<cfdump var="#result#" /> 
+0

+1, cfqueryparam का उपयोग करके, और क्वेरी को अधिक बारीक कॉल में विभाजित करें। –

+0

@ हारून धन्यवाद! मुझे नहीं पता कि मैं इसे इतने लंबे समय तक क्यों कर रहा हूं। यह बहुत आसान है। – Sequenzia

+0

मुझे नहीं पता क्यों, लेकिन मैं कभी भी परिणाम प्राप्त करने में सक्षम नहीं हूं। मेरे लिए काम करने के लिए। result.generated_key का उपयोग कर ठीक काम करता है। – Yisroel

1

यहाँ MSSQL के लिए एक त्वरित समाधान है:

result.identitycol // MSSQL 
result.rowid   // Oracle 
result.sys_identity // Sybase 
result.serial_col  // Informix 
result.generated_key // MySQL 

आप एक बहुत डंप के रूप में निम्नानुसार देख सकते हैं आप किसी भी सवाल है, तो। यह SCOPE_IDENTITY() फ़ंक्शन का उपयोग करता है जो पिछले डालने वाले कथन में डाली गई अंतिम पंक्ति की आईडी देता है।

http://msdn.microsoft.com/en-us/library/ms190315.aspx

<cfquery> 
    DECLARE @iNewGeneratedID INT 

    INSERT INTO transactions 
     (
      transactionDate, 
      transactionAmount 
     ) 
    VALUES 
     (
      <cfqueryparam value="#transactionDate#" type="cf_sql_date">, 
      <cfqueryparam value="#transactionAmount#" type="cf_sql_integer"> 
     ) 

    SET @iNewGeneratedID = SCOPE_IDENTITY() 

    INSERT INTO transactionItems 
     (
      transactionID, 
      itemID, 
      itemAmount 
     ) 
    VALUES 
     (
      @iNewGeneratedID, 
      <cfqueryparam value="#itemID#" type="cf_sql_integer">, 
      <cfqueryparam value="#itemAmount#" type="cf_sql_integer"> 
     ) 

    SELECT @iNewGeneratedID AS iNewGeneratedID 
</cfquery> 
+0

धन्यवाद! मुझे इस तरह से यह पसंद है कि मैं इसे कर रहा था। यह संग्रहित प्रक्रियाओं के लिए अच्छा होगा। – Sequenzia

0

getGeneratedKey function at cflib.org सबसे डेटाबेस के साथ प्रयोग किया जा सकता है:

उदाहरण:

<cfquery name="insertArtist" datasource="cfartgallery" result="r"> 
    insert into artists (firstName, lastName) 
    values('todd','sharp') 
</cfquery> 
<cfquery name="getArtists" datasource="cfartgallery"> 
    select * 
    from artists 
</cfquery> 
<cfdump var="#getArtists#"> 
<cfoutput>#getGeneratedKey(r)#</cfoutput> 

<cffunction name="getGeneratedKey" 
    hint="I normalize the key returned from cfquery" output="false"> 

     <cfargument name="resultStruct" hint="the result struct returned from cfquery" /> 
     <cfif structKeyExists(arguments.resultStruct, "IDENTITYCOL")> 
      <cfreturn arguments.resultStruct.IDENTITYCOL /> 
     <cfelseif structKeyExists(arguments.resultStruct, "ROWID")> 
      <cfreturn arguments.resultStruct.ROWID /> 
     <cfelseif structKeyExists(arguments.resultStruct, "SYB_IDENTITY")> 
      <cfreturn arguments.resultStruct.SYB_IDENTITY /> 
     <cfelseif structKeyExists(arguments.resultStruct, "SERIAL_COL")> 
      <cfreturn arguments.resultStruct.SERIAL_COL /> 
     <cfelseif structKeyExists(arguments.resultStruct, "GENERATED_KEY")> 
      <cfreturn arguments.resultStruct.GENERATED_KEY /> 
     <cfelse> 
      <cfreturn /> 
     </cfif> 
</cffunction> 
0

की @ हारून-GREENLEE जवाब के अनुसार, आर INSERT क्वेरी के एस्ल्ट चर में एक कुंजी-मूल्य जोड़ी होती है जो डाली गई पंक्ति की स्वचालित रूप से जेनरेट की गई आईडी होती है; this is available only for databases that support this feature.

और नीचे सभी डेटाबेस के लिए सम्मिलित रिकॉर्ड वापस करने का संभव तरीका है।

<cfquery result="result"> 
    INSERT INTO myTable (
     title 
    ) 
    OUTPUT INSERTED.* 
    VALUES (
    <cfqueryparam value="Nice feature!" cfsqltype="cf_sql_varchar"> 
    ) 
</cfquery> 

परिणामस्वरूप आपको रिकॉर्ड किए गए रिकॉर्ड विवरण मिलेंगे।

उम्मीद है कि इससे मदद मिलती है। धन्यवाद।

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