将多行插入不同的表中

时间:2011-11-24 15:10:18

标签: mysql

我想在我的数据库中的不同表中插入多行。这些语句是成对的,其中第二个语句依赖于第一个语句中的数据(特别是LAST_INSERT_ID())。

此代码有效,但我想知道它是否可以更好的方式完成? 有没有办法在一个查询中拥有它?

<?php

mysql_query("
INSERT INTO wp_terms (term_id, name, slug, term_group)
VALUES ('', 'Test 1', 'test-1', '0')
");

mysql_query("
INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy, description, parent, count)
VALUES ('', LAST_INSERT_ID(), 'mycustomfield', 'Descripton 1', '0', '0')
");

mysql_query("
INSERT INTO wp_terms (term_id, name, slug, term_group)
VALUES ('', 'Test 2', 'test-2', '0')
");

mysql_query("
INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy, description, parent, count)
VALUES ('', LAST_INSERT_ID(), 'mycustomfield', 'Descripton 2', '0', '0')
");

mysql_query("
INSERT INTO wp_terms (term_id, name, slug, term_group)
VALUES ('', 'Test 3', 'test-3', '0')
");

mysql_query("
INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy, description, parent, count)
VALUES ('', LAST_INSERT_ID(), 'mycustomfield', 'Descripton 3', '0', '0')
");

mysql_query("
INSERT INTO wp_terms (term_id, name, slug, term_group)
VALUES ('', 'Test 4', 'test-4', '0')
");

mysql_query("
INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy, description, parent, count)
VALUES ('', LAST_INSERT_ID(), 'mycustomfield', 'Descripton 4', '0', '0')
");

?>

4 个答案:

答案 0 :(得分:0)

如果要减少mysql_query的通话,是的,有一种方法,但您必须使用mysqli

mysqli::multi_query可以一次执行多个查询。

答案 1 :(得分:0)

您还可以创建一个INSERT触发器 -

DELIMITER $$

CREATE TRIGGER trigger_wp_terms_insert
AFTER INSERT
ON wp_terms
FOR EACH ROW
BEGIN
  INSERT INTO wp_term_taxonomy(term_taxonomy_id, term_id, taxonomy, description, parent, count)
    VALUES ('', NEW.term_id, 'mycustomfield', CONCAT('Descripton ', SUBSTRING_INDEX(new.name, ' ', '-1')), '0', '0');
END
$$

DELIMITER ;

然后使用一个批量INSERT语句将新行添加到wp_terms表中 -

INSERT INTO wp_terms (term_id, name, slug, term_group) VALUES
  ('', 'Test 1', 'test-1', '0'),
  ('', 'Test 2', 'test-2', '0'),
  ('', 'Test 3', 'test-3', '0'),
  ('', 'Test 4', 'test-4', '0');

答案 2 :(得分:0)

在我看来,使用存储过程将是best ways之一:

CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertWpTermAndTaxonomy`
    ( IN paramWPT_id <<PlaceTheRightDataTypeHere>>
    , IN paramWPT_name <<PlaceTheRightDataTypeHere>>
    , IN paramWPT_slug <<PlaceTheRightDataTypeHere>>
    , IN paramWPT_termgroup <<PlaceTheRightDataTypeHere>>
    , IN paramWPTX_id <<PlaceTheRightDataTypeHere>>
    , IN paramWPTX_taxonomy <<PlaceTheRightDataTypeHere>>
    , IN paramWPTX_description <<PlaceTheRightDataTypeHere>>
    , IN paramWPTX_parent <<PlaceTheRightDataTypeHere>>
    , IN paramWPTX_count <<PlaceTheRightDataTypeHere>>
BEGIN
    INSERT INTO wp_terms (term_id, name, slug, term_group)
    VALUES (paramWPT_id, paramWPT_name, paramWPT_slug, paramWPT_termgroup)

    INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy, description, parent, count)
    VALUES (paramWPTX_id, LAST_INSERT_ID(), paramWPTX_taxonomy, paramWPTX_description, paramWPTX_parent, paramWPTX_count)
END

然后使用这样的代码(虽然我选择PDO而不是MYSQL或MYSQLI):

# using an array which you can populate to contain all the 
# necessary parameters... 
$term_and_taxonomy_array_values = array('', 'Test 4', 'test-4', '0', '', 'mycustomfield', 'Descripton 4', '0', '0');

$sql = 'CALL InsertWpTermAndTaxonomy (?,?,?,?,?,?,?,?,?)';
$stmt = $pdo->prepare($sql);
foreach($term_and_taxonomy_array_values as $key => $value) {
    $stmt->bindValue($key + 1, $value);
}
$stmt->execute();

希望你能看看PDO,但mysqli也应该能够做到这一点。我对程序进行了编码,使其足够灵活,可以为两个表采取任何可接受的参数,即使看起来你有0'' s

如果你想进一步使这个动态化,比如说你可以建立你的参数数组数组,那么你只需要一个foreach来包装它......

答案 3 :(得分:0)

  1. 向wp_terms添加一个额外的列,您可以将列命名为session_key,这是为每个插入存储唯一值,唯一值的示例可以是当前时间戳concat与某些WP会话值
  2. 插入后,将session_key分配给唯一值并包含在插入语句
  3. 将所有插入到wp_terms中的单个insert ... values (...,session_key), (..., $session_key)
  4. 组合在一起
  5. 错误处理因素
  6. 成功插入后,您可以使用在步骤2中创建的唯一值insert into wp_term_taxonomy select ... where session_key = $session_key
  7. 通过这个小技巧,出现错误的可能性非常小