2011-11-24 27 views
0

我想在數據庫的多個表中插入多行。這些陳述是成對的,其中第二個依賴於第一個陳述中的數據(特別是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') 
"); 

?> 
+1

你最好添加一些錯誤處理ŧ o這些查詢 - 它們是相互依賴的(因爲你使用的是last_insert_id()和外鍵)。如果一個失敗,那麼在它之後的查詢也會失敗。 –

回答

0

如果是減少mysql_query通話的事情,是的,有一個辦法,但你必須使用mysqli這一點。

mysqli::multi_query可以一次執行多個查詢。

+0

感謝您的回答:)將着眼於它。 – Hakan

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'); 
+0

只是爲了分享..這將工作,如果要插入'wp_term_taxonomy'的數據總是不變的,除了'term_id'列..此表的數據發生變化時,您只需修改觸發器即可。 – Nonym

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和'' s

如果你想進一步使這種動態,例如說你可以建立您的參數數組的數組,然後你只需要一個更foreach把它包起來......

0
  1. 附加列添加到wp_terms,您可以命名列session_key,這是一個存儲每個插入的唯一值,唯一值的示例可以是當前時間戳concat與一些WP會話值
  2. 在插入時,分配session_key一個獨特的價值,計入插入語句
  3. 將所有插入到wp_terms成單insert ... values (...,session_key), (..., $session_key)
  4. 因素在錯誤處理
  5. 後,你已經成功插入,您可以使用到insert into wp_term_taxonomy select ... where session_key = $session_key

這個小竅門你在步驟2中創建的獨特價值,準備打一個錯誤是相當最小