使用LOAD DATA LOCAL INFILE从CSV添加数据库行,并添加每行唯一的字段

时间:2014-11-12 12:58:18

标签: php mysql sql

我创建了一个从.csv文件插入数据库行的查询,然后使用随机生成的字符串填充一个字段。这是我使用的代码:

$sql = "LOAD DATA LOCAL INFILE '".$_FILES["file"]["tmp_name"]."'
        INTO TABLE mailinglist
        FIELDS TERMINATED BY ';'
        LINES TERMINATED BY '\r'
        (name, email)
        SET unsubscribe = '".substr(sha1(mt_rand()),0,30)."'";

$db = dbConnection();

$q = $db->prepare($sql);
$q->execute();

我遇到的问题是取消订阅字段在每一行中都填充了相同的随机生成的字符串,而它应该为每个新行生成另一个字符串。我怎样才能解决这个问题呢?

3 个答案:

答案 0 :(得分:1)

让mysql使用内置的UUID函数来完成作业而不是php:

$sql = "LOAD DATA LOCAL INFILE '".$_FILES["file"]["tmp_name"]."'
        INTO TABLE mailinglist
        FIELDS TERMINATED BY ';'
        LINES TERMINATED BY '\r'
        (name, email)
        SET unsubscribe = SUBSTRING(REPLACE(UUID(),"-",""),0,30)";

或更好:

        SET unsubscribe = UUID()";

答案 1 :(得分:0)

使用str_random(' dddd CC');功能

答案 2 :(得分:0)

你可以用这个:

concat(
  substring('abcdefghijklmnopqrstuvwxyz0123456789',rand(@seed:=round(rand(LAST_INSERT_ID())*4294967296))*3 6+1, 1),
  substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed)*36+1, 1)
)

它将生成一个长度为3的随机字符串。只需多次重复使用中间子字符串即可。

编辑:

如果您不需要真正的随机性,可以使用uniqid()