[sql] 하나의 쿼리로 두 테이블에서 삭제

MySQL에 두 개의 테이블이 있습니다.

#messages table  : 
messageid
messagetitle
.
.

#usersmessages table 
usersmessageid
messageid
userid
.
.

이제 메시지 테이블에서 삭제하려면 괜찮습니다. 그러나 messageid로 메시지를 삭제할 때 레코드는 usersmessage에 여전히 존재하며이 두 테이블에서 한 번에 삭제해야합니다.

다음 쿼리를 사용했습니다.

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

그런 다음 테스트

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

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



답변

세미콜론으로 구분할 수 없습니까?

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

또는

INNER JOIN아래와 같이 사용하십시오.

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


답변

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

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


답변

당신이 중 하나를 만들어야 FOREIGN KEYON DELETE CASCADE:

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하지만 트랜잭션은 테이블 에만 영향을 미칩니다 .


답변

두 가지 옵션이 있습니다.

먼저 트랜잭션 내에서 두 개의 문을 수행합니다.

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

또는 외래 키로 ON DELETE CASCADE를 설정할 수 있습니다. 이것이 더 나은 접근 방식입니다.

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

ON DELETE CASCADE에 대한 자세한 내용은 여기에서 확인할 수 있습니다 .


답변

JOINS 필요 없음 :

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1

AND m.messageid = um.messageid


답변

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


답변

OP는 삭제 후 테이블 별칭이 누락되었습니다.

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