2013-12-11 3 views
3

У меня возникли проблемы с поиском правильного синтаксиса для загрузки CSV-файла в таблицу, пропуская первый столбец, который уже существует в таблице. Мои столбцы таблицы выглядит следующим образом:LOAD DATA INFILE, пропуская первый столбец в таблице

ID COL1 COL2 COL3 LOG_DATE 

и мой CSV выглядит следующим образом:

dataForCol1,dataForCol2,dataForCol3 

Так что я хочу, чтобы загрузить значения в CSV в COL1 COL2 и COL3, пропуская ID. Ближайший я могу получить это с SQL, как это:

LOAD DATA LOCAL INFILE 'test.csv' 
INTO TABLE test_table 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
(ID,COL1,COL2,COL3,LOG_DATE) 
SET ID=0, LOG_DATE=CURRENT_TIMESTAMP 

Обратите внимание, что я не знаю SQL слишком хорошо, и я не уверен, если я с помощью предложения SET правильно либо, но это утверждение будет поставлять LOG_DATE колонку отметка о время, и он будет автоматически увеличивать ID колонки (ID является type: int(11) и auto_incerement), но другие данные от одной колонки так dataForCol1 отсутствуют и dataForCol2 в COL1 и т.д.

ответ

10

список столбцов должен Iclude столбцов которые находятся только в файле:

LOAD DATA LOCAL INFILE 'test.csv' 
INTO TABLE test_table 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
(COL1,COL2,COL3) 
SET LOG_DATE=CURRENT_TIMESTAMP 
0

Единственный способ решить эту же проблему - создать временную таблицу для загрузки всех данных, а затем вставить эти данные в постоянную таблицу. Я использовал это в сочетании с процессом с загрузки нескольких файлов:

# Check for attempted file/s upload 
if (isset($_FILES['files'])) 
{ 
    # Create a temporary table to insert data into 
    $sql="CREATE TEMPORARY TABLE `Temp` (Region VARCHAR(60), First_Name VARCHAR(35), Last_Name VARCHAR(35), Title VARCHAR(60), Account_Name VARCHAR(60), Phone VARCHAR(21), Email VARCHAR(60));"; 
    $Result = mysql_query($sql,$MySQL_Read); 

    # Loop through file/s to be uploaded 
    foreach ($_FILES['files']['tmp_name'] as $key => $tmp_name) 
    { 

     # Upload file 
     move_uploaded_file($tmp_name, $Path."{$_FILES['files']['name'][$key]}"); 
     echo $Path."{$_FILES['files']['name'][$key]}<br>"; 

     # LOAD DATA from CSV file into Temp 
     $sql="LOAD DATA INFILE '".$Path."{$_FILES['files']['name'][$key]}' INTO TABLE `Temp` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r' STARTING BY '' IGNORE 1 LINES;"; 
     $Result = mysql_query($sql,$MySQL_Write); 
     echo($sql.'<br><br>'); 

     # Delete file 
     unlink($Path."{$_FILES['files']['name'][$key]}"); 
    } 
} 

# Insert data from temp table into permanent table 
$sql="INSERT INTO `Leads` (`Region`, `First_Name`, `Last_Name`, `Title`, `Account_Name`, `Phone`, `Email`) SELECT `Region`, `First_Name`, `Last_Name`, `Title`, `Account_Name`, `Phone`, `Email` FROM `Temp`;"; 
$Result = mysql_query($sql,$MySQL_Write); 

# Delete temporary table 
$sql="DROP TEMPORARY TABLE Temp;"; 
$Result = mysql_query($sql,$MySQL_Write); 
0

Просто переместите ID седловины до последней позиции поля, как это:

EG: COL1 COL2 COL3 ID LOG_DATE 

Затем используют один и тот же код без определения ваших полей или id:

LOAD DATA LOCAL INFILE 'test.csv' 
INTO TABLE test_table 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
SET LOG_DATE=CURRENT_TIMESTAMP 

Супер легкий и отлично работает.