我想在我的数据库中的不同表中插入多行。这些语句是成对的,其中第二个语句依赖于第一个语句中的数据(特别是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')
");
?>
答案 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)
session_key
,这是为每个插入存储唯一值,唯一值的示例可以是当前时间戳concat与某些WP会话值session_key
分配给唯一值并包含在插入语句insert ... values (...,session_key), (..., $session_key)
insert into wp_term_taxonomy select ... where session_key = $session_key
通过这个小技巧,出现错误的可能性非常小