Удаление строки в MySQL

0

У меня есть таблица:

NACHRICHT_ID | VERFASSER_USERNAME | BETREFF | TEXT |  DATUM    | EMPAENGER_ID
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-01|  
     1       |          h         | hfgh    | hfgh |  23:15:10 |    31
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-02|  
     3       |          h         | hfgh    | hfgh |  00:30:10 |    31
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-02|  
     4       |          q         | hfgh    | hi   |  11:42:06 |    31
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-02|  
     5       |          h         | hfgh    | hfgh |  12:53:56 |    31
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-02|  
     6       |          h         | hfgh    | hfgh |  13:19:53 |    31
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-02|  
     7       |          h         | hfgh    | hfgh |  13:20:18 |    31
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-02|  
     8       |         mkd        | hfgh    | hfgh |  13:47:32 |    31
------------------------------------------------------------------------------
             |                    |         |      | 2009-07-02|  
     9       |          h         | hfgh    | hfgh |  16:42:10 |    31
------------------------------------------------------------------------------

Я пытаюсь удалить строку, где NACHRICHT_ID = 3:

DELETE FROM NACHRICHTEN JOIN 
                    NACHRICHTEN_EMPFAENGER_MAP USING (NACHRICHT_ID)
                    WHERE EMPFAENGER_ID = 31 && NACHRICHT_ID = 3 ;

Но он не работает. Что я делаю неправильно?

  • 2
    @darkrain darkrain - объясните, что вы имеете в виду, когда говорите, что «удаление произойдет после объединения». Это совсем не ясно.
  • 0
    Возможно, вы пытаетесь удалить все новости, которые были отправлены конкретному получателю?
Теги:

6 ответов

5

Твой вопрос непонятен.

У вас есть 3 таблицы:

  • NACHRICHTEN = Новости
  • NACHRICHTEN_EMPFAENGER_MAP = Страница новостей для получателей.
  • EMPFAENGER (я угадываю имя) = Получатели

Вы хотите удалить новость? Затем сделайте следующее:

delete from NACHRICHTEN where NACHRICHT_ID = 3;

Если вы хотите удалить сопоставление между новостным элементом с идентификатором 3 и получателем с идентификатором 31, сделайте следующее:

delete from NACHRICHTEN_EMPFAENGER_MAP where NACHRICHT_ID=3 and EMPFAENGER_ID=31;

Если вы хотите удалить фактического получателя с идентификатором 31, сделайте это (при условии, что таблица называется EMPFAENGER)

delete from EMPFAENGER where EMPFAENGER_ID = 31;

Если вы хотите сделать что-то еще, задайте вопрос с подробной информацией.

2

Соединение - это операция, которая создает временную таблицу на основе данных из нескольких других таблиц и извлекает значения из этой временной таблицы, а затем отбрасывает ее (это концепция, а не фактическая реализация).

Таким образом, удаление "из" или "после объединения" - это идея, которая не имеет большого смысла. Но если я правильно разобрался, вы просто хотите удалить сообщение (Nachricht). Вы должны просто удалить это сообщение из таблицы сообщений, как показано в других ответах.

После этого, если вы сделаете свой SELECT * FROM ... JOIN ..., вы увидите, что сообщение также отсутствует в результате соединения.

Я надеюсь, что это поможет.

PS: Нет необходимости кричать на людей, которые пытаются вам помочь.

2
DELETE FROM 'table' WHERE NACHRICHT_ID = 3
2

Я предполагаю, что вы используете MyISAM как ваш механизм хранения, который, к сожалению, не поддерживает внешние ключи.

Итак, учитывая следующие таблицы:

A
---
A_ID (PK), A_SOMETHING

B
---
B_ID (PK), B_SOMETHING

C
---
A_ID (PK, FK), B_ID (PK, FK)

Если вы хотите удалить все As, которые связаны с B_ID = 13, вы можете сделать следующее.

DELETE FORM A WHERE A_ID IN (SELECT A_ID FROM C WHERE B_ID = 13);

Или, если вы хотите удалить все как там, где связанное значение B B_SOMETHING равно 'Foo':

DELETE FORM A WHERE A_ID IN
    (SELECT C.A_ID FROM B,C
         WHERE B.B_ID = C.B_ID
           AND B.B_SOMETHING = 'Foo'
    );

После этого вы выполните некоторую очистку:

DELETE FROM C WHERE A_ID NOT IN (SELECT A_ID FROM A);

Теперь все это вручную, и вам лучше использовать механизм хранения с поддержкой внешних ключей (InnoDB).

Вы должны предоставить снимок экрана из всех соответствующих таблиц, а не только результат. Это сделало бы ваш вопрос намного яснее.

  • 0
    +1 за технически точность. Я думаю, что предложение внешних ключей также является хорошим, но, возможно, немного выходит за рамки этого вопроса.
1
DELETE FROM NACHRICHTEN 
WHERE EMPFAENGER_ID = 31 && NACHRICHT_ID = 3;
1
  • 0
    Действительная точка. Не заслуживает -2. +1
  • 0
    Также не заслуживает -1. +1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню