2011-10-27 83 views
2

我對php/mysql非常新穎,這是我從一開始就第一個真正的獨奏項目。我在apache/php中爲mysql中的庫創建數據庫,並且在數據庫的結構和組織方面遇到了一些問題。 我有以下表格:如何更新多對多表格:刪除,刪除全部,插入,重新插入

  1. 叢書包含在每本書
  2. 標籤信息 - 標籤識別和標籤名稱(如301:懸疑,302:犯罪,303:神祕)
  3. Booktags與相關聯的標籤每本書(如BOOKID 27 TAGID 301,BOOKID 27,標籤識別302)

然後,用戶可以通過標籤搜索圖書(我查詢Booktags表,找到與特定標籤相關的所有圖書。

當輸入或更新書籍上的信息時,用戶輸入標籤列表(逗號分隔)或從預定義的彈出列表中選擇。

我現在正在更新信息的問題。如果用戶選擇更改爲書籍定義的現有標籤,我想刪除不再需要的標籤。我應該根據新列表檢查現有標籤並刪除不相關的標籤嗎?或者刪除與本書相關的所有標籤並插入相關標籤(假設在某些情況下我將刪除並重新插入相同的東西)會更好嗎? (如果你認爲我處理事情的一個愚蠢的或低效的方式,請提出一個方法,以更好地做到這一點也可以)

回答

2

簡單地刪除每個標籤並插入新聞

任何意見,將不勝感激。 這將花費如果您已經定義了PRIMARYUNIQUE關鍵組成book_id和TAG_ID的更少的時間,並減少能源

0

,你可以做這樣的事情:最初選擇

CREATE TABLE book_tag (
    book_id INT(10) NOT NULL, 
    tag_id INT(10) NOT NULL, 
    modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (book_id,tag_id) 
); 

這些標籤:1 ,2,3

INSERT IGNORE INTO book_tag(book_id, tag_id) VALUES 
(1,1), 
(1,2), 
(1,3); 
/* 3 rows affected, 0 rows found. Duration for 1 query: 0.031 sec. */ 

一些標籤被觸發後,仍然選擇這些標籤:3,4,5,現在,這裏是你能做什麼:

ⅰ)除去所有標籤,除了所選擇的:

DELETE FROM book_tag 
WHERE book_id = 1 AND tag_id NOT IN (3, 4, 5); 
/* 2 rows affected, 0 rows found. Duration for 1 query: 0.047 sec. */ 

ⅱ)添加被選擇的所有代碼中使用INSERT IGNORE

INSERT IGNORE INTO book_tag(book_id, tag_id) VALUES 
(1,3), 
(1,4), 
(1,5); 
/* 2 rows affected, 0 rows found. Duration for 1 query: 0.016 sec. */ 

最終結果是:

SELECT * FROM book_tag; 
/* 0 rows affected, 3 rows found. Duration for 1 query: 0.000 sec. */ 

book_id tag_id modified 
======= ====== =================== 
1  3  2011-10-27 14:06:27 -- the row inserted in the first pass 
1  4  2011-10-27 14:07:04 -- the row inserted in the second pass 
1  5  2011-10-27 14:07:04 -- the row inserted in the second pass 
+1

謝謝,我雖然我必須先做一個SELECT並計算需要插入的行d和需要刪除的行。你知道你的方法是否比首先刪除全部然後再次插入更快? – felixfbecker