SQL УДАЛИТЬ с JOIN - PullRequest
       2

SQL УДАЛИТЬ с JOIN

0 голосов
/ 21 октября 2011

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

//$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));

Обновление:

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.

ОБНОВЛЕНИЕ 3:

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

Ответы [ 3 ]

1 голос
/ 21 октября 2011

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

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

        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 голосов
/ 21 октября 2011

Не уверен, почему вы пытаетесь сделать это на уровне приложения.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 голосов
/ 21 октября 2011

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

Я вижу одну проблему.Вы упоминаете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...