仅为一列插入不同的值

时间:2015-09-05 07:52:16

标签: php mysql

说,我有一个包含五列col1col2col3col4user_id的表格。现在,我有一组user_id值,比如一千。我想插入数千条记录,其中只有不同的列值为user_id。如果有一个更简单的方法而不是制作一千个('col1value','col2value','col3value','col4value',someUserId)并在单insert into tbl (col1,col2,col3,col4,user_id) values个查询中连接它们?

更新:我想这需要一些澄清

所以这是一个简单的例子。假设我有一个events表格,其中包含字段eventuser_id。对于ID为1,2,5,101,233,422和1000的用户,会发生一些call事件。因此,我需要在表中插入7条记录,使其看起来像

+-------+---------+
| event | user_id |
|-------|---------|
|  call |       1 |
|  call |       2 |
|  call |       5 |
|  call |     101 |
|  call |     233 |
|  call |     422 |
|  call |    1000 |
+-------+---------+

我希望尽可能高效地实现数据库。到目前为止,我认为我必须进行这样的SQL查询:

insert into events (event,user_id) values ('call',1),('call',2),('call',5),('call',101),('call',233),('call',422),('call',1000);

然后执行单个查询

但也许有一些更简单有效的方法?也许是SQL参数之类的东西?

3 个答案:

答案 0 :(得分:1)

我理解您的问题是您要插入大量不同的user_id值,但是对于每个新记录,您需要col1col2的相同值, col3col4

实现此目标的最简单方法是为每个列设置DEFAULT值:

ALTER TABLE mytable CHANGE `col1` `col1` INTEGER NOT NULL DEFAULT 1234

这会将col1的默认值设置为1234。我假设列属于数据类型INTEGER,您需要相应地更改它。

如果更改表不适合您,那么您仍然可以构建一个插入语句,该语句将在单个事务中插入所有记录:

$user_ids = array(5,6, 7, 8, 9, 10); // these are the user ids you want to insert
$default_vals = array(1, 2, 3, 4); // These are the default values used for col1, col2, col3 and col4

$con = new mysqli('mydomain', 'myuser', 'mypw', 'mydb');

$rows = array();
foreach ($user_ids as $id)
    $rows[] = "(".implode(',', $default_vals).",$id)";
$sql = "INSERT INTO mytbl (col1, col2, col3, col4, id) VALUES " . implode(',', $rows) . ";";

$con->query($sql);

或者,如果出于学术原因,你宁愿写一个INSERT语句来完成整个工作,你可以写:

INSERT INTO mytbl (col1, col2, col3, col4, id)
SELECT * FROM 
  (SELECT 1, 2, 3, 4) AS DEFAULT_VALS,
  (SELECT 5
   UNION SELECT 6
   UNION SELECT 7
   UNION SELECT 8
   UNION SELECT 9) AS USER_IDS

然而,最后一种方法确实不是很好。无论是在可读性还是在性能方面。

<小时/> 的修改
我为你做了一个快速的基准测试:

  • 在我的网络服务器上插入10k个不同的记录(如我的PHP示例中的 1.5086660385132秒
  • 使用10k SELECT INTO s的UNION方法 3.3481941223145秒

很容易做出选择。

答案 1 :(得分:0)

使用:

INSERT INTO tbl (col1,col2,col3,col4,user_id)
VALUES 
  (1,2,3,4,1000),
  (2,3,4,5,1000),
  (6,7,8,9,1000),
  (1,2,3,4,1234),
  (4,3,2,1,1235);

答案 2 :(得分:0)

user_id字段上创建唯一索引。使用INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE来忽略user_id的重复插入。

有关详细信息,请参阅MySQL文档。

http://dev.mysql.com/doc/refman/5.6/en/insert.html

相关问题