1

MySQL5.0でColdfusionMX7を使用してテーブルを更新しようとしていますが、クエリは最初のレコードのみを更新/追加し、他の60,000レコードは更新/追加しません。

<cfquery name="count" datasource="voyager">
SELECT 
        PATRON.PATRON_ID, 
        PATRON.HISTORICAL_CHARGES, 
        PATRON.HISTORICAL_BOOKINGS, 
        PATRON.HISTORICAL_DISTRIBUTIONS, 
        PATRON.HISTORICAL_SHORT_LOANS, 
        PATRON.HISTORICAL_CHARGES_UB, 
        PATRON.HISTORICAL_REQUESTS_UB
FROM PATRON
</cfquery>


<cfquery name="update" datasource="patrons">
    <cfoutput>
    REPLACE INTO patrondailyusecounttotals (PATRON_ID, HISTORICAL_CHARGES)
    VALUES ('#count.PATRON_ID#', '#count.HISTORICAL_CHARGES#')
    </cfoutput>
</cfquery>
4

1 に答える 1

1

ループを使用する必要があります。

<cfquery name="count" datasource="voyager">
  SELECT 
    PATRON.PATRON_ID, 
    PATRON.HISTORICAL_CHARGES, 
    PATRON.HISTORICAL_BOOKINGS, 
    PATRON.HISTORICAL_DISTRIBUTIONS, 
    PATRON.HISTORICAL_SHORT_LOANS, 
    PATRON.HISTORICAL_CHARGES_UB, 
    PATRON.HISTORICAL_REQUESTS_UB
  FROM 
    PATRON
</cfquery>

<cfloop query="count">
  <cfquery name="update" datasource="patrons">
    REPLACE INTO patrondailyusecounttotals (PATRON_ID, HISTORICAL_CHARGES)
    VALUES (
      <cfqueryparam value="#PATRON_ID#" cfsqltype="CF_SQL_VARCHAR">, 
      <cfqueryparam value="#HISTORICAL_CHARGES#" cfsqltype="CF_SQL_VARCHAR">
    )
  </cfoutput>
</cfloop>

ここでは、使用<cfqueryparam>が推奨されるアプローチであることに注意してください。最初のループの後にループが繰り返されるたびに、パラメーター値のみがサーバーに送信されるため(毎回完全なSQLコードを送信するのではなく)、「内部クエリ」が大幅に高速化されます。


編集

回答の元のバージョンでは次のことが推奨されていましたが、個別のデータベースサーバーが関係する状況では明らかにそれだけでは不十分です。

<cfquery name="update" datasource="patrons">
  REPLACE INTO 
     patrondailyusecounttotals (PATRON.PATRON_ID, HISTORICAL_CHARGES)
  SELECT 
     PATRON_ID, HISTORICAL_CHARGES
  FROM 
     PATRON
</cfquery>
于 2012-03-22T16:32:27.363 に答える