2014-01-12 3 views
1

В MySQL у меня есть три таблицы: projects, tags и tags_posts.MySQL: вставлять данные в таблицы с внешними ключами

tags_posts представляет собой таблицу между projects и tags, который держит project_id и tag_id в качестве внешних ключей. Это, поэтому я могу легко выбрать все теги для project_id = x или выбрать все проекты для tag_id = y.

Конечно, я хочу добавить проекты в базу данных. Я узнал о START TRANSACTION; и COMMIT;, так что запросы будут выполнены вообще или вообще не будут выполняться. Но какой запрос я должен использовать для INSERT, SELECT и UPDATE данных для этих трех таблиц сразу?

Я думал об использовании: 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 Workbench дает ошибку 1452: ограничение внешнего ключа не выполняется. PHPMyAdmin зависает при выполнении этого запроса. Кто может помочь мне с правильными запросами до INSERT, UPDATE или SELECT для этих трех таблиц? ER Diagram of the three tables mentioned

+0

Вы должны вставить в 'tags_posts' LAST, после того, как строки были вставлены в' теги' и 'проекты'. –

+0

Конечно, это звучит разумно! Но, кроме того, мои запросы действительны? –

ответ

1

Вы должны вставить родителя (projects и tags) строки первой, а затем добавить ссылки на многие-ко-многим таблице 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

Смежные вопросы