【问题标题】:Insert distinct values only for one column仅为一列插入不同的值
【发布时间】:2015-12-01 08:43:01
【问题描述】:

假设,我有一个包含五列 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 参数之类的东西?

【问题讨论】:

  • 将插入语句放入循环中。除非您发布代码供我们查看,否则我们无法给您任何代码建议。

标签: php mysql


【解决方案1】:

我理解您的问题,即您想要插入大量不同的 user_id 值,但对于每条新记录,您希望 col1col2col3 和 @987654325 的值相同@。

实现这一点的最简单方法是为每一列设置一个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

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


编辑
我为你做了一个快速的基准测试:
  • 像在我的 PHP 示例中那样插入 10k 条不同的记录在我的网络服务器上花费了 1.5086660385132 秒
  • 10k UNIONs 的 SELECT INTO 方法耗时 3.3481941223145 秒

不过,选择很简单。

【讨论】:

  • 是的,第二种方法看起来像我需要的,除了我不确定 MySQL 处理选择联合的效率如何,即使对于定义的值。但是当常量列的数量和它们的大小很高时,它可能非常值得!
  • @kerby:使用UNIONs 的方法要慢得多,这并不奇怪。 INSERT INTO 有很多记录是一种非常常见的场景,因此您可以假设数据库已针对此类事务进行了优化。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    使用:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多