복붙노트

[SQL] 한 쿼리에서 두 테이블에서 삭제

SQL

한 쿼리에서 두 테이블에서 삭제

나는 MySQL은 두 개의 테이블이

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

지금은 메시지 테이블에서 삭제하려면 괜찮아요. 나는 메시지 ID로 메시지를 삭제할 때 레코드가 여전히 사용자가 메시지에 존재하고 내가 한 번에이 두 테이블에서 삭제해야합니다.

나는 다음과 같은 쿼리를 사용 :

DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ; 

그럼 테스트

   DELETE FROM messages , usersmessages 
   WHERE messages.messageid = usersmessages.messageid 
   and messageid='1' ; 

그러나이 두 쿼리는이 작업을 달성하지 않습니다.

해결법

  1. ==============================

    1.당신은 단지 그들을 세미콜론 (;)으로 분리 할 수 ​​있습니까?

    당신은 단지 그들을 세미콜론 (;)으로 분리 할 수 ​​있습니까?

    Delete from messages where messageid = '1';
    Delete from usersmessages where messageid = '1'
    

    또는

    그냥 INNER 아래와 같은 조인을 사용

    DELETE messages , usersmessages  FROM messages  INNER JOIN usersmessages  
    WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1'
    
  2. ==============================

    2.

    DELETE a.*, b.* 
    FROM messages a 
    LEFT JOIN usersmessages b 
    ON b.messageid = a.messageid 
    WHERE a.messageid = 1
    

    번역 : 테이블 uersmessages가의 MessageID =의 MessageID 테이블 메시지가있는 경우의 MessageID = 1, uersmessages 테이블의 행을 삭제 테이블 메시지에서 삭제.

  3. ==============================

    3.당신도 ON DELETE CASCADE와 FOREIGN KEY를 작성해야합니다 :

    당신도 ON DELETE CASCADE와 FOREIGN KEY를 작성해야합니다 :

    ALTER TABLE usersmessages
    ADD CONSTRAINT fk_usermessages_messageid
    FOREIGN KEY (messageid)
    REFERENCES messages (messageid)
    ON DELETE CASCADE
    

    , 또는 트랜잭션에 두 개의 쿼리를 사용하여 수행

    START TRANSACTION;;
    
    DELETE
    FROM    usermessages
    WHERE   messageid = 1
    
    DELETE
    FROM    messages
    WHERE   messageid = 1;
    
    COMMIT;
    

    거래는하지만, InnoDB만을 테이블에 영향을 미칩니다.

  4. ==============================

    4.당신은 두 가지 옵션이 있습니다 :

    당신은 두 가지 옵션이 있습니다 :

    첫째, 트랜잭션 내부의 두 문장은 수행

    BEGIN;
      DELETE FROM messages WHERE messageid = 1;
      DELETE FROM usermessages WHERE messageid = 1;
    COMMIT;
    

    또는, 외래 키로 설정 DELETE CASCADE ON있을 수 있습니다. 이것은 더 나은 방법입니다.

    CREATE TABLE parent (
      id INT NOT NULL,
        PRIMARY KEY (id)
    );
    
    CREATE TABLE child (
      id INT, parent_id INT,
      FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
    );
    

    당신은 더 여기 DELETE CASCADE ON에 대한 읽을 수 있습니다.

  5. ==============================

    5.

    DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'
    
  6. ==============================

    6.없음에 대한 필요성이 조인

    없음에 대한 필요성이 조인

    DELETE m, um FROM messages m, usersmessages um
    
    WHERE m.messageid = 1 
    
    AND m.messageid = um.messageid 
    
  7. ==============================

    7.이 제발 시도

    이 제발 시도

    DELETE FROM messages,usersmessages
    
    USING messages
    
    INNER JOIN usermessages on (messages.messageid = usersmessages.messageid)
    
    WHERE messages.messsageid='1'
    
  8. ==============================

    8.영업 이익은 삭제 후 테이블 별칭이 없습니다

    영업 이익은 삭제 후 테이블 별칭이 없습니다

    DELETE t1, t2 
    FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id 
    WHERE t1.id = some_id
    
  9. ==============================

    9.이 시도..

    이 시도..

    DELETE a.*, b.*  
    FROM table1 as a, table2 as b  
    WHERE a.id=[Your value here] and b.id=[Your value here]
    

    나는 샘플 컬럼으로 ID를 할 수 있습니다.

    다행이 도움이됩니다. :)

  10. ==============================

    10.당신은 또한 모두 열이가 있거나 동일한 열 이름의 많은 경우 특정 값을 삭제하려면, 다음과 같이 사용할 수 있습니다.

    당신은 또한 모두 열이가 있거나 동일한 열 이름의 많은 경우 특정 값을 삭제하려면, 다음과 같이 사용할 수 있습니다.

    DELETE project , create_test  FROM project INNER JOIN create_test
    WHERE project.project_name='Trail' and  create_test.project_name ='Trail' and project.uid= create_test.uid = '1';
    
  11. ==============================

    11.당신이 아래 삭제할> 행 - 여기에 언급되지 않은 다른 방법이, 모든 테이블에 대한 배열을 설정할 수 있습니다 (I은 아직 완전히 그것의 성능을 테스트하지 않았다)

    당신이 아래 삭제할> 행 - 여기에 언급되지 않은 다른 방법이, 모든 테이블에 대한 배열을 설정할 수 있습니다 (I은 아직 완전히 그것의 성능을 테스트하지 않았다)

    // set your tables array
    $array = ['table1', 'table2', 'table3'];
    
    
    // loop through each table
    for($i = 0; $i < count($array); $i++){
    
     // get each single array
     $single_array = $array[$i];
    
     // build your query
     $query = "DELETE FROM $single_array WHERE id = 'id'";
    
     // prepare the query and get the connection
     $data = con::GetCon()->prepare($query);
    
     // execute the action
     $data->execute();
    }
    

    당신은 홈 페이지로 사용자를 리디렉션 할 수 있습니다.

    header('LOCATION:' . $home_page);
    

    이 의지 도움말 사람을 희망 :)

    감사

  12. from https://stackoverflow.com/questions/1233451/delete-from-two-tables-in-one-query by cc-by-sa and MIT license