1

我希望您能帮助我解决一些我搜索了很多但还没有找到答案的问题。正如问题的标题所述,我正在尝试在 mySql 数据库中创建一个表,其中我不知道列的数据类型。基本上,我使用 php 从 csv 文件在我的数据库中创建新表。第一行包含列名。我知道它可以做到,因为我在 phpMyAdmin 中看到过它,我可以在其中选择一个 csv 文件并使用第一行生成表列名称,并且我不必指定每列的数据类型,

到目前为止,这是我的 php 代码:

$databaseName="myDatabase";
mysql_connect("localhost","xxxxxx","xxxxxxxx");
mysql_select_db($databaseName);


for($i = 0; $i < count($newFiles); $i++){//traverse the table that contains the file names
         $content = file($newFileLocation.$newFiles[$i]);

        //First line: $content[0];
        $firstLine=$content[0];//save first line which are the column names
        //echo  $firstLine;
        $tableName= str_replace('.txt','', $newFiles[$i]);//remove the .txt to use for table name
        //echo $tableName."\n";

        echo "\n\ncreating tables\n\n";
        /*mysql_query("load data local infile '$newFiles[$i]' 
               into table $tableName
                   fields terminated by ','
                   lines terminated by '\n'
                   ($firstLine) "); */


        mysql_close();
}
4

2 回答 2

1

MySQL 中没有“未知”数据类型(也许 blob 类型最相似)。

如果您确实需要仅根据其名称自动定义表字段,并且不知道将在那里存储哪种类型的数据,请将它们创建为 blob 或文本,并在存储值时创建由其实际类型制成的文本表示形式标题加上值的文本表示。

或者也许你根本不需要那个。检查使用 PHP 获取 CSV 文件的第一行并使用数据创建一个 MySQL 表,也许您会在那里找到响应。

于 2012-04-22T12:01:15.563 回答
0

这是问题的解决方案。首先,我们取文件的第一行来保存 cols 名称(以便我们知道如何创建表)。我们将它保存在一个字符串中,然后我们根据逗号字符将它们分开。之后,我们获取包含值的文件的第二行。我们将该行存储到一个字符串中,并根据逗号字符将字符串分隔为不同的值。我们将使用它来识别每列的类型。

所以,这就是代码。

$databaseName="myDatabase";
mysql_connect("localhost","xxxxxx","xxxxxxxx");
mysql_select_db($databaseName);


for($k = 0; $k < count($newFiles); $k++){//traverse the table that contains the file names
            $content = file($newFileLocation.$newFiles[$k]);

            //First line: $content[0];
             $firstLine=$content[0];
             $secondLine=$content[1];   
            //echo $firstLine."\n";
            $firstLine = str_replace("\r\n",'',$firstLine);
            $colNames=explode(',',$firstLine);
            $fieldList = explode(',',$secondLine);

            $dataType="";
            for($i = 0; $i < count($fieldList); $i++){
                if (is_numeric($fieldList[$i])){
                        if (strpos($fieldList[$i],'.') == false){
                            $fieldList[$i] = (int)$fieldList[$i];
                       }else{
                            $fieldList[$i] = (float)$fieldList[$i];
                        }
                    }

                switch(gettype($fieldList[$i])) {
                        case 'integer':
                            $typeInfo = 'int(11)';
                            break;
                        case 'float':
                        case 'double':
                                $typeInfo = 'float';
                                break;

                        case 'string':
                                $typeInfo = 'varchar(80)';
                            break;
                        default:
                                $typeInfo = 'varchar(80)';
                                break;
                        }

                if(gettype($fieldList[$i]) != NULL) {
                    $dataType= $dataType.'`'.$colNames[$i].'` '." ".$typeInfo.' NOT NULL';
                    if(($i)!=count($fieldList)-1){
                        $dataType= $dataType.",";
                    }
                }
            }   //end of for loop


             $tableName= str_replace('.txt','', $newFiles[$k]);
             //echo $tableName."\n";

            //
                //echo "\n".$dataType."\n";
                $succ=mysql_query("CREATE TABLE `$tableName` ($dataType)");
                if($succ)
                    echo "Table ".$tableName." was created Succesfully \n";

                //echo $databaseName;

                 $loadsql = 'LOAD DATA LOCAL INFILE "'.$newFileLocation.$newFiles[$k].'" INTO TABLE `'.$tableName.'` FIELDS TERMINATED BY ","  IGNORE 1 LINES ('.$firstLine.')';
                 mysql_query($loadsql);     




        }//end of for loop


     mysql_close();
于 2012-04-22T17:36:02.453 回答