如果我一次性插入多行数据,数据库查询会更快吗?
例如:
INSERT....
UNION
INSERT....
UNION
(我需要插入大约 2-3000 行)
如果我一次性插入多行数据,数据库查询会更快吗?
例如:
INSERT....
UNION
INSERT....
UNION
(我需要插入大约 2-3000 行)
INSERT
语句使用VALUES
语法可以插入多行。为此,请包含多个列值列表,每个列表都在括号内,并由逗号分隔。
示例:
INSERT INTO tbl_name
(a,b,c)
VALUES
(1,2,3),
(4,5,6),
(7,8,9);
INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3
。当然,如果插入的值来自不同的表,则这种方法会更好。 - Zohar Peled从文本文件加载表格时,请使用LOAD DATA INFILE。这通常比使用INSERT语句快20倍。
您可以在上面的链接中找到更多关于如何加速INSERT语句的技巧。
Insert IGNORE
可以避免因重复记录而导致插入失败。这样可以跳过重复的记录。 - user3649739只需使用SELECT
语句获取所选列的多行值,并一次性将这些值放入另一个表的列中。例如,表“test_a”的列“size”和“price”会填充到表“test_b”和“test_c”的相应列“size”和“price”中。
BEGIN;
INSERT INTO test_b (size, price)
SELECT size, price
FROM test_a;
INSERT INTO test_c (size, price)
SELECT size, price
FROM test_a;
COMMIT;
代码被嵌入在 BEGIN
和 COMMIT
中,只有当这两个语句都正常工作时才会运行它,否则到该点为止的整个运行将被撤销。
这里提供了一个适用于n:m(多对多关系)表的PHP解决方案:
// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;
// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
`table_1_fk_id`,
`table_2_fk_id`,
`insert_date`
) VALUES ";
//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
$query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}
// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));
编辑:在@john的评论后,我决定用更高效的解决方案来增强这个答案:
// limit of query size (lines inserted per query)
$query_values = "";
$limit = 100;
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;
$query = "INSERT INTO `table` (
`table_1_fk_id`,
`table_2_fk_id`,
`insert_date`
) VALUES ";
foreach($table_1 as $row) {
$query_values .= "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW()),";
// entire table parsed or lines limit reached :
// -> execute and purge query_values
if($i === array_key_last($table_1)
|| fmod(++$i / $limit) == 0) {
$db->query($query . rtrim($query_values, ','));
$query_values = "";
}
}
// db table name / blog_post / menu / site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title)
VALUES ('$site_title', '$sub_title')";
// db table name / blog_post / menu / site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
VALUES ('$menu_title', '$sub_menu', )";
// db table name / blog_post / menu / site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
VALUES ('$post_title ', '$post_des', '$post_img')";