2014-01-12 119 views
1

在MySQL中,我有三個表:projects,tagstags_postsMySQL:在外鍵表中插入數據

tags_postsprojectstags之間的表中包含project_idtag_id爲外鍵。這樣,我就可以輕鬆選擇project_id = x的所有標籤,或選擇tag_id = y的所有項目。

當然,我想將項目添加到數據庫。我已經瞭解到START TRANSACTION;COMMIT;,這樣查詢將完全執行,或根本不執行。 但是,我必須使用什麼查詢將INSERT,SELECTUPDATE數據同時用於這三個表格?

我曾想過使用: INSERT INTO projects([column-1], [column-2], [column-N]) VALUES([value-1], [value-2], [value-N]);

INSERT INTO tags_posts(tag_id, project_id) VALUES(1, LAST_INSERT_ID());

INSERT INTO tags(tag_id, tag_name) VALUES(LAST_INSERT_ID(), 'php');

MySQL工作臺提供了一個錯誤1452:外鍵約束失敗。 PHPMyAdmin掛起執行此查詢。 誰可以幫我使用正確的查詢INSERT,UPDATESELECT這三張表? ER Diagram of the three tables mentioned

+0

將行插入'tags'和'projects'後,您必須在'tags_posts'最後插入'tags_posts'。 –

+0

當然,這聽起來很合理!但是,除此之外,我的查詢是否有效? –

回答

1

你必須先插入父(projectstags)行,然後添加引用到許多一對多表tags_posts

您的代碼可能是這樣的

START TRANSACTION; 
-- Add a project 
INSERT INTO projects(title, description, datum) VALUES ('title1', 'description1', CURDATE()); 
SET @project_id = LAST_INSERT_ID(); 
-- Add a tag 
INSERT INTO tags (tag_name) VALUES ('tag1'); 
SET @tag_id = LAST_INSERT_ID(); 
-- Now add a tag to the project 
INSERT INTO tags_posts (tag_id, project_id) VALUES (@tag_id, @project_id); 
COMMIT; 

這裏是SQLFiddle演示


如果您需要添加一個標籤,然後添加幾個項目,這個標籤,你可以做

START TRANSACTION; 
INSERT INTO tags (tag_name) VALUES ('tag1'); 
SET @tag_id = LAST_INSERT_ID(); 

INSERT INTO projects(title, description, datum) VALUES ('title1', 'description1', CURDATE()); 
INSERT INTO tags_posts (tag_id, project_id) VALUES (@tag_id, LAST_INSERT_ID()); 

INSERT INTO projects(title, description, datum) VALUES ('title2', 'description2', CURDATE()); 
INSERT INTO tags_posts (tag_id, project_id) VALUES (@tag_id, LAST_INSERT_ID()); 
COMMIT; 

這是SQLFiddle demo