2014-06-12 3 views
2

Привет, мои 4 таблицы.Как удалить из таблицы взаимосвязь 4 таблицы

client_parent_question: -

+----+------------+------------+---------+-----+------+------+ 
| id | is_deleted | sort_order | version | cid | pid | qid | 
+----+------------+------------+---------+-----+------+------+ 
| 1 |   |   1 |  0 | 1 | 1 | 1 | 
| 2 |   |   2 |  0 | 1 | 1 | 2 | 
| 3 |   |   3 |  0 | 1 | 1 | 3 | 
| 4 |   |   4 |  0 | 1 | 1 | 4 | 
| 5 |   |   1 |  0 | 1 | 2 | 7 | 
+----+------------+------------+---------+-----+------+------+ 

MySQL> выберите * из client_parent;

+----+------------+------------+---------+-----+------+ 
| id | is_deleted | sort_order | version | cid | pid | 
+----+------------+------------+---------+-----+------+ 
| 1 |   |   1 |  0 | 1 | 1 | 
| 2 |   |   2 |  0 | 1 | 2 | 
+----+------------+------------+---------+-----+------+ 
2 rows in set (0.00 sec) 

MySQL> выберите * из client_question;

+----+------------+---------+-----+------+------+ 
| id | is_deleted | version | cid | pqid | qtid | 
+----+------------+---------+-----+------+------+ 
| 1 |   |  0 | 1 | 1 | 1 | 
| 2 |   |  0 | 1 | 2 | 4 | 
| 3 |   |  0 | 1 | 2 | 4 | 
| 4 |   |  0 | 1 | 1 | 1 | 
| 5 |   |  0 | 1 | 2 | 4 | 
| 6 |   |  0 | 1 | 3 | 4 | 
| 7 |   |  0 | 1 | 3 | 4 | 
| 8 |   |  0 | 1 | 1 | 1 | 
| 9 |   |  0 | 1 | 2 | 4 | 
| 10 |   |  0 | 1 | 3 | 4 | 
| 11 |   |  0 | 1 | 4 | 4 | 
| 12 |   |  0 | 1 | 4 | 4 | 
+----+------------+---------+-----+------+------+ 

MySQL> выберите * из client_question_option;

+----+------------+---------+------+------+ 
| id | is_deleted | version | cqid | oid | 
+----+------------+---------+------+------+ 
| 1 |   |  0 | 2 | 1 | 
| 2 |   |  0 | 3 | 4 | 
| 3 |   |  0 | 6 | 2 | 
| 4 |   |  0 | 7 | 3 | 
| 5 |   |  0 | 11 | 1 | 
| 6 |   |  0 | 12 | 4 | 
| 7 |   |  0 | 14 | 1 | 
| 8 |   |  0 | 15 | 4 | 
+----+------------+---------+------+------+ 

Я знаю только чид и PID из client_parent таблицы

Моя цель состоит в том, чтобы удалить все из client_question, client_parent_question и client_question_option

В client_question_option cqid идентификатор идентификатор client_question таблицы

Следующие sqlfiddle

Я сделал

DELETE FROM cqo,qo,cpq client_question_option cqo ,client_question cq,client_parent_question ,client_parent cp 
WHERE cqo.cqid=cq.id AND cq.pqid=pq.id AND cqo.oid=qo.id AND cq.cid=1 AND cp.pid=1 

Но это не помогло.

+1

Можете ли вы изменить свои таблицы, чтобы включить [при удалении каскада] (http://www.mysqltutorial.org/mysql-on-delete-cascade/)? – paqogomez

+0

@paqogomez Спасибо, что пытались помочь. Моя цель - использовать HQL.So. Я сначала пытаюсь использовать sql, и если он работает, то делает это для hql.I не знаю, может ли каскадирование быть выполнено в hql или нет. – rocking

ответ

1

синтаксис вашего DELETE Query ошибочен, который должен быть Somthing так: -

DELETE cqo,cp,pq 
FROM client_question_option cqo, client_question cq, client_parent_question pq, client_parent cp 
WHERE cqo.cqid=cq.id AND cq.pqid=pq.id AND cqo.oid=cp.id AND cq.cid=1 AND cp.pid=1; 

Надеется, что это поможет.

1

используя внутреннее соединение

DELETE cqo,cq,cp,pq 
FROM client_question_option cqo 
INNER JOIN client_question cq 
INNER JOIN client_parent_question as pq 
INNER JOIN client_parent cp 
WHERE cqo.cqid=cq.id AND cq.pqid=pq.id AND cqo.oid=cqo.id AND cq.cid=1 AND cp.pid=1 
+0

. Небольшое описание было приятно объяснить ОП о том, почему вы использовали внутреннее соединение. –

+0

@DamienJoe, если вы определяете ограничения внешнего ключа, тогда внутреннее соединение выполняется быстро. –

2

Вам просто нужно переместить FROM ключевое слово после того, как таблицы псевдонимов.См multiple-table syntax

DELETE cqo, qo, cpq 
FROM client_question_option cqo, 
    client_question cq, 
    client_parent_question, 
    client_parent cp 
WHERE cqo.cqid=cq.id AND cq.pqid=pq.id AND cqo.oid=qo.id 
     AND cq.cid=1 AND cp.pid=1; 
0

У вас есть возможность в MYSQL называется OnDelete CASCADE, где в том, когда вы установите на ключе

Например: внешний ключ (CID) ссылки client_parent (CID) ON DELETE CASCADE при удалении ключа на основе вашего условия все идентификаторы ссылок будут удалены, поэтому достаточно простого запроса на удаление родительской строки, чтобы удалить все дочерние строки, присутствующие в других табличных данных.

Преимущества использования ПО DELETE CASCADE

  1. вы не требуете направо innerjoins и удалять данные вручную
  2. вы не получите родительский ключ ошибки позиционирования
  3. вы можете сэкономить ваше время

Thats это NJOY !!!

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