1

内部結合を使用してメイン テーブルに挿入したい一時テーブルに 150 万レコードの mysql テーブルがあります。

私のコードは機能しますが、103,613 レコードで停止します。ITは進みません。なぜそれが止まるのですか?どうして最後まで行かないの?

これは私の現在のコードです

INSERT INTO phone_calls(next_attempt, created_on, modified_on, status, call_subject,
account_number, call_code, last_attempt_on, total_attempts, account_id

,team_id
,campaign_id
,call_code_id
,result_code
,result_code_id
,time_zone_id
,trigger_on
,first_attempt_on
,first_attempt_by
,last_attempt_by
,modified_by
,client_id
,last_call_id
,call_notes
,owner_id
,industry_id
)


SELECT 
CASE WHEN next_attempt IS NULL OR next_attempt = '' THEN STR_TO_DATE(replace(t.next_attempt,'/',','),'%m,%d,%Y %T') END as next_attempt,
CASE WHEN t.created_on IS NULL OR t.created_on = '' THEN '0000-00-00 00:00:00' ELSE STR_TO_DATE(replace(t.created_on,'/',','),'%m,%d,%Y %T') END as created_on,
CASE WHEN t.modified_on IS NULL OR t.modified_on = '' THEN '0000-00-00 00:00:00' ELSE STR_TO_DATE(replace(t.modified_on,'/',','),'%m,%d,%Y %T') END AS modified_on,
CONVERT( CASE WHEN t.status IS NULL OR t.status = '' THEN 0 ELSE t.status END,  UNSIGNED INTEGER) AS status,
LEFT(IFNULL(t.call_subject, ''), 100),
t.account_number,
CONVERT( CASE WHEN t.callcode IS NULL OR t.callcode = '' THEN 0 ELSE t.callcode END , UNSIGNED INTEGER) AS callcode, STR_TO_DATE(replace(t.last_attempt_on,'/',','),'%m,%d,%Y %T') as last_attempt_on,
CONVERT( CASE WHEN t.New_Attempts IS NULL OR t.New_Attempts = '' THEN 0 ELSE t.New_Attempts END ,  UNSIGNED INTEGER) AS New_Attempts,
a.account_id
,0
,0
,0
,0
,0
,0
, '0000-00-00 00:00:00'
, '0000-00-00 00:00:00'
,1
,1
,1
,1
,0
,'IMPORTED FROM CRM'
,1
,1
FROM tmp_table_for_rdi_cms AS t
INNER JOIN accounts AS a ON a.account_number = t.account_number LIMIT 9999999999;
these 2 fields are indexed so it runs fast
a.account_number
t.account_number

ここで、符号なし整数のタイプを持つ一部のフィールドに値を挿入していないことはわかっていますが、後でこれを更新するので問題ありません。

レコードを失うことなく、この INSERT INTO クエリを実行するにはどうすればよいですか?

4

1 に答える 1

0

「デフォルト値がありません」という問題は、S NOT NULL定義され、デフォルト値で定義されていない新しいテーブルの列のソーステーブルにnullがあることです。

これを修正するには、次の3つの選択肢があります。

  1. ターゲット列をnull可能として定義します(NOT NULLを省略します)
  2. デフォルト値でターゲット列を定義します。NOT NULL DEFAULT 'some value'
  3. 列がnullの場合、つまり値を指定しますSELECT ifnull(source_column, 'some value)

切り捨てられた誤ったINTEGER値の 問題。char値から選択してint列に配置していますが、一部のvyesが空白であるため、次の処理を行う必要があります。

select if(source_column = '', 0, source_column)

ソース値がターゲット列が収容できるよりも大きい/長いため、列の問題で切り捨てられたデータがあります。修正するには、ターゲット列をより大きく(intではなくbigint)またはより長く(たとえば、varchar(20)ではなくtextまたはvarchar(80))に定義します。

于 2013-03-09T00:02:50.670 に答える