2009-04-09 29 views
7

Estoy tratando de usar SQL para eliminar varias filas de varias tablas que están juntas .eliminar filas de varias tablas

Tabla A se une a la Tabla B Tabla B se une a la Tabla C

quiero borrar todas las filas de la tabla B & C que corresponde a una fila de la tabla A

CREATE TABLE `boards` (
    `boardid` int(2) NOT NULL AUTO_INCREMENT, 
    `boardname` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`boardid`) 
); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `messages` 
-- 

CREATE TABLE `messages` (
    `messageid` int(6) NOT NULL AUTO_INCREMENT, 
    `boardid` int(2) NOT NULL DEFAULT '0', 
    `topicid` int(4) NOT NULL DEFAULT '0', 
    `message` text NOT NULL, 
    `author` varchar(255) NOT NULL DEFAULT '', 
    `date` datetime DEFAULT NULL, 
    PRIMARY KEY (`messageid`) 
); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `topics` 
-- 

CREATE TABLE `topics` (
    `topicid` int(4) NOT NULL AUTO_INCREMENT, 
    `boardid` int(2) NOT NULL DEFAULT '0', 
    `topicname` varchar(255) NOT NULL DEFAULT '', 
    `author` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`topicid`) 
); 

Respuesta

18

Bueno, si hubiera utilizado las tablas InnoDB, se podría establecer un cascading delete with foreign keys que hacerlo todo de forma automática. Pero si usted tiene alguna razón para usar MyISAM, sólo tiene que utilizar un multiple-table DELETE:

DELETE FROM boards, topics, messages 
USING boards INNER JOIN topics INNER JOIN messages 
WHERE boards.boardid = $boardid 
    AND topics.boardid = boards.boardid 
    AND messages.boardid = boards.boardid; 
+0

¿Por qué "USING" y no "ON"? – pingu

+0

+1 aquí gracias .. – nickanor

+0

¿y si la tabla tiene más de 50 millones de registros? – vikram

2

Usted podría simplemente comprobar si hay presencia

delete from topics where boardid in (select boardid from boards) 
delete from messages where boardid in (select boardid from boards) 

pero esto sólo tendría sentido si este comportamiento no debe aplicarse siempre . Cuando el comportamiento siempre debe aplicar, implementar las claves externas con borrar en cascada

explicó en un sitios trillón, en sus archivos de ayuda y here

1

filas Eliminación de varias tablas se puede hacer de dos maneras:

  • eliminar filas de una tabla, para determinar qué filas para borrar haciendo referencia a otra tabla
  • eliminar filas de varias tablas con una sola declaración

Las declaraciones DELETE de varias mesas se pueden escribir en dos formatos. El siguiente ejemplo demuestra una sintaxis, para una consulta que elimina filas de una tabla t1 donde los valores de ID coinciden con los de una tabla t2:

DELETE t1 FROM t1, t2 WHERE t1.id = t2.id; 

La segunda sintaxis es ligeramente diferente:

DELETE FROM t1 USING t1, t2 WHERE t1.id = t2.id; 

Para eliminar los registros coincidentes de ambas tablas, las declaraciones son:

DELETE t1, t2 FROM t1, t2 WHERE t1.id = t2.id; 
DELETE FROM t1, t2 USING t1, t2 WHERE t1.id = t2.id; 

El cláusulas ORDER BY y LIMIT normalmente apoyados por actualizar y borrar las que no se permiten cuando estas declaraciones se usan para operaciones de tabla múltiple.

Cuestiones relacionadas