2011-10-21 5 views
0

Почему следующий запрос не работает? Каков наилучший способ удалить следующие пять строк таблицы в SQL? Как я могу это исправить?SQL DELETE with JOIN

//$id = $this->input->post('id'); 
$id = '65'; 
    $this->db->query(" 
     DELETE table_1, table_2, table_3, table_4, table_5 
     FROM table_1 
      JOIN table_2 ON table_1.id = table_2.rela 
      JOIN table_3 ON table_2.h_id = table_3.h_id   
      JOIN table_4 ON table_1.id = table_4.rela 
      JOIN table_5 ON table_2.h_id = table_5.h_id 
     WHERE table_1.id =".floor($id)); 

Update:

table_1.id => это имеет идентификатор 65
table_2.rela => это уже Рела 65
table_2.h_id => это есть h_id 11
table_3.h_id => это уже h_id 11
table_4.rela => это имеет РЕЛА 65
table_5.h_id => это уже h_id 11

Обновление 2:

в table_1.id один имеют 65, а также для table_2 и table_4, которые имеют rela 65 (table_1.id = table_2.rela => 65 = 65, table_1.id = table_4.rela => 65 = 65) сейчас в table_2 у нас есть имя столбца h_id, которое имеет номер 11, и оно установлено с h_id в других таблицах [table_3, table_5].

Как с этим соотношением можно получить id от table_1 и удалить другие строки в своих таблицах.

я грива это: (с один id из table_1 мы можем удалить другие строки отношения с ним в своих таблицах, в следующем является примером из этих отношений)

table_1.id = 65 =>table_4.rela = 65 =>table_2.rela = 65 ->table_2.h_id = 11 =>table_3.h_id = 11 =>table_5.h_id = 11 .

UPDATE 3:

Кто может помочь мне в решении моей проблемы, есть парень? Я не получаю ответы на вопрос.

+4

Что, черт возьми, вы пытаетесь сделать? –

+0

Первое место, где вы всегда начинаете, - это сообщение об ошибке. Каково было сообщение об ошибке? –

+0

Кто может помочь мне в моей проблеме, есть парень? Я не получаю ответы на вопрос. – JimBo

ответ

1

Вы должны удалить строки своих таблиц один за другим.

Его также можно определить таблицу для каскадного удаления ... Если вы это сделаете, вам нужно удалить только одну строку в одной таблице. Другие связанные строки в другой таблице будут удалены автоматически.

 CREATE TABLE `tableName` (
     `id` int(10) unsigned NOT NULL auto_increment, 
     `typeId` int(10) unsigned NOT NULL, 
     PRIMARY KEY (`id`), 
     KEY `type` (`typeId`) 
     CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`) 
      REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 

надеюсь, что это помогает

+0

Вы можете удалить из нескольких таблиц одновременно, как указано здесь: http://dev.mysql.com/doc/refman/5.0/en/delete.html – Draiken

+0

Просьба привести пример из моего sql. спасибо – JimBo

+0

ваш sql просто НЕ sql. –

0

Вы говорите, что хотите удалить таблицы, но вы, вероятно, означает, что вы хотите удалить строку из таблицы. Удаление или удаление таблицы означает удаление таблицы и всего ее содержимого.

Я вижу одну проблему. Вы упоминаете table_1 в первой части, но не снова. Предположим, что первая таблица - table_1, а не tour_foreign.

DELETE table_1, table_2, table_3, table_4, table_5 
    FROM table_1 
     INNER JOIN table_2 ON table_1.id = table_2.rela 
     INNER JOIN table_3 ON table_2.h_id = table_3.h_id   
     INNER JOIN table_4 ON table_1.id = table_4.rela 
     INNER JOIN table_5 ON table_2.h_id = table_5.h_id 
    WHERE table_1.id = 5 

Из MySQL документации это выглядит, как вы также можете оставить список таблиц, если вы хотите удалить строки из всех этих таблиц:

DELETE FROM table_1 
     INNER JOIN table_2 ON table_1.id = table_2.rela 
     INNER JOIN table_3 ON table_2.h_id = table_3.h_id   
     INNER JOIN table_4 ON table_1.id = table_4.rela 
     INNER JOIN table_5 ON table_2.h_id = table_5.h_id 
    WHERE table_1.id = 5 
+0

не работает. у него есть ошибка: http://pastebin.com/Lnnst8AM – JimBo

+0

Нет, допустим ошибку, я хочу удалить строки в таблицах. как оно? – JimBo

+0

Попробуйте внутреннее соединение, как предлагает документ. Я пересмотрел свой ответ. –

0

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

mysql> show create table child_table; 

Если есть ограничение внешнего ключа доступны, вы должны увидеть что-то вроде:

CONSTRAINT `constraint_id` FOREIGN KEY (`some_id`) REFERENCES `some_table` (`id`) ON DELETE CASCADE 

Что это означает, если вы удалите строки из «some_table», любые строки в «child_table», которые ссылаются на тот же идентификатор, что и «some_table», будут автоматически удалены.

http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html для получения дополнительной информации.

Если вам нужно сделать это на уровне приложения, тогда вы должны действительно рассмотреть транзакцию, я предполагаю, что вы используете PDO, хотя он может работать с mysqli. Ниже представлено потенциальное решение, поэтому я не несу ответственности за потерю данных, которые могут возникнуть.

$this->db->beginTransaction(); 

try { 

    $this->db->execute('DELETE FROM table_1 WHERE id = 65'); 
    $this->db->execute('DELETE FROM table_2 WHERE rela = 65'); 
    $this->db->execute('DELETE FROM table_3 WHERE h_id = 11'); 
    $this->db->execute('DELETE FROM table_4 WHERE rela = 65'); 
    $this->db->execute('DELETE FROM table_5 WHERE h_id = 11'); 

    $this->db->commit(); 

} catch (Exception $e) { 

    error_log($e->getMessage()); 

    $this->db->rollBack(); 

    $e = null; // PHP is notorious for not cleaning exceptions very well so force it 
} 
+0

' В других таблицах нет идентификатора строки, некоторые из них - 'h_id 'и некоторые другие' rela', значения их в строке таблицы различны. см. мое обновление в первом сообщении. – JimBo

+0

Вы проверили, есть ли уже существующие ограничения FK? –

+0

Я не понимаю, что вы имеете в виду «уже существующие ограничения FK»? – JimBo