2014-12-10 2 views
0

예를 찾을 수 없었습니다. 어쩌면 불가능할 수도 있고 적절한 검색 단어를 사용하지 않고있는 것일 수도 있습니다.MySQL에서 다른 테이블의 값을 사용하여 DELETE 문을 필터링하는 방법은 무엇입니까?

그것은 간단하다 : 나는 이벤트에 대한 외부 키와 조인 된 테이블이 있습니다

CREATE TABLE dbp_Join(
Event INT, 
Participant INT, 
Location INT, 
TST TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP, 
FOREIGN KEY(Event) REFERENCES dbp_Events(ID) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE, 
FOREIGN KEY(Participant) REFERENCES dbp_Participants(ID) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE, 
FOREIGN KEY(Location) REFERENCES dbp_Locations(ID) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE 
)ENGINE = INNODB; 

을 그리고 이벤트 테이블이 있습니다

CREATE TABLE dbp_Events(
ID INT auto_increment, 
Name Char(80), 
ETime DATETIME NOT NULL, 
Details VARCHAR(2000), 
E_TST TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP, 
PRIMARY KEY(ID, E_TST) 
)ENGINE = INNODB; 

을 내가 가지고있는 이벤트를 참조하는 테이블에 참여의 가치와 참석하는 사용자. 2014-12-12에 일어나는 이벤트를 참조하는 Join 테이블의 모든 행을 삭제하고 싶습니다. 어떻게 그 쿼리를 작성합니까? 그럴 수있어? 그냥 전체 테이블을 비워, 내가

DELETE FROM dbp_Join, dbp_Events WHERE DATE(`ETime`)='2014-12-12'; 

을 시도

DELETE FROM dpb_Join WHERE DATE(dbp_Events.`ETime`)='2014-12-12'; 

그러나 그것은 작동하지 않습니다 :이 같은 것을 갖고 싶어.

UPDATE : 는 MySQL의에서 예를 들어 그것을 할 올바른 방법처럼 보였다 참조를 삭제했지만, 그것은 아무것도 삭제되지 않습니다 : 내가 여기에 문제를 볼 수 없습니다

DELETE dbp_join FROM dbp_join INNER JOIN dbp_events 
WHERE DATE(dbp_events.ETime='2014-12-12'); 
+0

방금 ​​이벤트를 삭제할 수 없습니다 참조? – Strawberry

+0

그럴 수는 없지만 인스턴스를 지우고 이벤트 자체를 지우고 싶지는 않습니다. – Megakoresh

답변

1

을!?! ?

DROP TABLE IF EXISTS events; 

CREATE TABLE events (event_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,event_date DATE NOT NULL); 

INSERT INTO events (event_date) VALUES ('2014-12-12'),('2014-12-13'); 

CREATE TABLE event_participants (event_id INT NOT NULL,participant VARCHAR(12) NOT NULL,PRIMARY KEY(event_id,participant)); 

INSERT INTO event_participants VALUES (1,'Adam'),(1,'Bob'),(2,'Adam'),(2,'Charles'); 

SELECT * FROM events; 
+----------+------------+ 
| event_id | event_date | 
+----------+------------+ 
|  1 | 2014-12-12 | 
|  2 | 2014-12-13 | 
+----------+------------+ 

SELECT * FROM event_participants; 
+----------+-------------+ 
| event_id | participant | 
+----------+-------------+ 
|  1 | Adam  | 
|  1 | Bob   | 
|  2 | Adam  | 
|  2 | Charles  | 
+----------+-------------+ 

DELETE ep FROM events e JOIN event_participants ep ON ep.event_id = e.event_id WHERE e.event_date = '2014-12-12'; 
Query OK, 2 rows affected (0.03 sec) 

SELECT * FROM events; 
+----------+------------+ 
| event_id | event_date | 
+----------+------------+ 
|  1 | 2014-12-12 | 
|  2 | 2014-12-13 | 
|  3 | 2014-12-12 | 
|  4 | 2014-12-13 | 
+----------+------------+ 

SELECT * FROM event_participants; 
+----------+-------------+ 
| event_id | participant | 
+----------+-------------+ 
|  2 | Adam  | 
|  2 | Charles  | 
+----------+-------------+ 
+0

오, 그럼 그냥 FROM 다음에 날짜를 포함하는 테이블을 넣고 foriegn 키 테이블에 가입하십시오. 기본적으로 주위에 교환하십시오. 글쎄 그 논리는 나에게 의미가 없지만 작동합니다. 감사합니다! – Megakoresh

+0

이것은 내부 조인입니다. 테이블의 순서는 아무런 차이가 없습니다. – Strawberry

+0

네,하지만 분명히 DELETE와 FROM 사이에 넣는 것은 않습니다. 당신의 솔루션이 마지막 시도와 다르므로 나는 단지 그것에 대해서만 시도했습니다. – Megakoresh

1

JOIN을 사용하면 삭제 속도가 느려집니다. 대신 IN 절을 사용하십시오.

DELETE FROM dbp_Join WHERE Event IN (
    SELECT ID FROM dbp_Events WHERE ETime = DATE('2014-12-12') 
) 

Delete with Join in MySQL

+0

무엇을 증명해야합니까? –

+0

테스트 데이터가 없습니다. 이 효과는 엄청난 양의 데이터에서만 볼 수 있습니다. 그리고 그것은 같은 날 행사의 숫자에 달려 있습니다. 같은 날 (3000 이벤트 미만) 1000 개의 이벤트가있는 경우 두 솔루션 모두 동일한 속도를 보입니다. –

+0

JOIN은 항상 행을 곱합니다. 첫 번째 테이블의 각 행은 두 번째 테이블의 각 행과 비교되어야합니다. m x n 개의 레코드를 읽어야합니다. select를 사용하면 두 번째 테이블에 하나의 쿼리 만 있습니다. 결과는 내부적으로 저장됩니다. 속도를 향상 시키려면 : DATE 대신 UNIX 시간 소인이있는 INTEGER를 사용해야합니다. –

관련 문제