簡體   English   中英

僅為一列插入不同的值

[英]Insert distinct values only for one column

比如說,我有一個包含五列col1col2col3col4user_id 現在,我有一組user_id值,比如說一千。 我想插入數千條記錄,其中只有不同的列值是user_id 如果有更簡單的方法而不是制作一千個 ('col1value','col2value','col3value','col4value',someUserId) 並將它們連接insert into tbl (col1,col2,col3,col4,user_id) values查詢?

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

所以這是一個簡單的例子。 假設我有一個帶有字段eventuser_idevents表。 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 參數之類的東西?

我理解您的問題,您有大量不同的user_id值要插入,但對於每條新記錄,您都希望col1col2col3col4具有相同的值。

實現這一點的最簡單方法是為每一列設置一個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 UNIONSELECT INTO方法花費了3.3481941223145 秒

不過選擇很簡單。

用 :

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

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

有關詳細信息,請參閱 MySQL 文檔。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM