The simplest way to do what you want would be with LEFT JOIN
, since idticket
will be NULL
in those rows where there are no matches.
DELETE t FROM ticket t
LEFT JOIN ticketdetail td ON t.id=td.idticket
WHERE td.idticket IS NULL;
Let's see a proof of concept:
Code
SEE DEMO IN REXTESTER
CREATE TABLE IF NOT EXISTS ticket
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ticket_name VARCHAR(25)
)ENGINE=INNODB;
INSERT INTO ticket (ticket_name)
VALUES
('Ticket 1'),
('Ticket 2'),
('Ticket 3')
;
CREATE TABLE IF NOT EXISTS ticket_detail
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ticket_id INT,
ticket_fecha DATETIME,
FOREIGN KEY fk_ticket(ticket_id) REFERENCES ticket(id)
ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=INNODB;
INSERT INTO ticket_detail (ticket_id,ticket_fecha)
VALUES
(1,'2016-10-12'),
(1,'2016-10-13'),
(2,'2016-10-14'),
(1,'2016-10-15'),
(1,'2016-10-16'),
(2,'2017-10-17')
;
/*Antes del borrado*/
SELECT * FROM ticket;
DELETE t FROM ticket t
LEFT JOIN ticket_detail td ON t.id=td.ticket_id
WHERE td.ticket_id IS NULL;
/*Después del borrado*/
SELECT * FROM ticket;
Result:
-Antes
id ticket_name
1 Ticket 1
2 Ticket 2
3 Ticket 3
-Después
id ticket_name
1 Ticket 1
2 Ticket 2