Pregunta

Tengo dos tablas: órdenes y orders_items. Ambos comparten el orderID campo.

Quiero borrar todas las filas de ambas tablas, donde orderID = 500, pero tengo que hacer esto en una sola consulta. ¿Es esto posible?

¿Fue útil?

Solución

Puede definir la tabla con ON DELETE CASCADE . Si lo hace, es suficiente con eliminar en la tabla de orden. Las entradas de otras tablas utilizando order_id como clave externa con la opción activada se borrará automágicamente.

Este ejemplo se toma de la MySQL manual de :

CREATE TABLE parent(
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child(
    id INT, parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;

Tenga en cuenta que el motor es InnoDB.

Otros consejos

Sin duda, se puede hacer lo siguiente:

DELETE FROM `table1`, `table2` WHERE `orderId` = 500

http://dev.mysql.com/doc/refman /5.0/en/delete.html

[EDIT:]

Este es todo el truco:

DELETE FROM `orders`, `orders_items` 
  USING `orders` 
  INNER JOIN `orders_items` ON `orders`.`orderId` = `orders_items`.`orderId` 
  WHERE `orders`.`orderId`= 500

Si orderId es un varchar, a continuación, cambiar el estado a = '500'.

Eso depende de su motor de base de datos, pero básicamente lo que necesita suena como usted quiere un cuadro de correspondencia entre la otra usando un FOREIGN KEY con la opción ON DELETE CASCADE y luego la eliminación de la tabla primaria se eliminará automáticamente filas correspondientes de las tablas dependientes.

Aquí hay una simple solución si estás usando MySQL / PgSQL ...

DELETE t1, t2 FROM table1 AS t1 
LEFT JOIN table2 AS t2 USING( orderID ) 
WHERE t1.orderID = 500;

garantizado para trabajar como un encanto!

Asegúrese de reemplazar tabla1 y tabla2 con los nombres de tablas apropiadas en su caso.

He usado un montón de esta consulta en mi diseño personalizado CMS - donde quiera que he querido evitar dos consultas atómicas distintas. Esto es tan bueno como una eliminación en cascada y la consulta puede ampliarse para abarcar más de tantas tablas como desee.

Aquí hay otro ejemplo que implica 3 tablas:

DELETE t1, t2, t3 FROM table1 AS t1 
LEFT JOIN table2 AS t2 USING( orderID ) 
LEFT JOIN table3 AS t3 USING( orderID ) 
WHERE t1.orderID = 500;

Cheers, m ^ e

Si está utilizando InnoDB (o un motor de almacenamiento compatible con ellas) que puede utilizar las restricciones FOREIGN KEY para eliminar las filas correspoding. Esta es una de la manera más fácil / más segura si no te importa el ligero impacto en el rendimiento de las claves externas. Tenga en cuenta sin embargo, que las filas eliminadas debido a las limitaciones no reciben disparadores para disparar.

Como alternativa, puede utilizar disparadores. Trabajan con cualquier motor de almacenamiento y son por lo general bastante fácil de escribir. Me gustan pero no son de buen calidad si va a eliminar un gran número de filas a la vez (varios cientos o miles.)

CREATE TRIGGER ad_orders AFTER DELETE ON orders
FOR EACH ROW DELETE FROM orders_items WHERE orderID = OLD.orderID;

Por último, como se sugiere en una respuesta anterior, se puede usar de varias mesas BORRAR:

DELETE o, oi
FROM orders o
LEFT JOIN orders_items oi USING (orderID)
WHERE o.orderID = 500;

¿Podría utilizar una función almacenada y llamar a eso?

Y a continuación, dentro de su función almacenada que tendría tanto eliminar consultas. Entonces, cuando la función almacenada se llama se ejecutará como una transacción y se puede hacer lo que quiera volver.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top