Aquí está el script para crear mis tablas:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
En mi código PHP, al eliminar un cliente, quiero eliminar todas las publicaciones de proyectos:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
La tabla de publicaciones no tiene una clave foránea client_id
, solo project_id
. Quiero eliminar las publicaciones en proyectos que han pasado client_id
.
Esto no funciona en este momento porque no se eliminan las publicaciones.
DELETE posts FROM posts JOIN projects ...
, en lugar de unIN (subquery)
patrón. (La respuesta de Yehosef da un ejemplo del patrón preferido.)alias
para el nombre de la tabla y usar eso.Respuestas:
Solo necesita especificar que desea eliminar las entradas de la
posts
tabla:EDITAR: para obtener más información, puede ver esta respuesta alternativa
fuente
DELETE d FROM posts AS d JOIN projects AS p ON ...
DELETE posts , projects FROM posts INNER JOIN projects ON projects.project_id = posts.project_id WHERE projects.client_id = :client_id
Como está seleccionando varias tablas, la tabla para eliminar ya no es inequívoca. Necesitas seleccionar :
En este caso,
table_name1
ytable_name2
son la misma tabla, entonces esto funcionará:Incluso puede eliminar de ambas tablas si desea:
Tenga en cuenta que
order by
ylimit
no funciona para eliminaciones de varias tablas .También tenga en cuenta que si declara un alias para una tabla, debe usar el alias al referirse a la tabla:
Las contribuciones de Carpetsmoker y etc .
fuente
ON
se escribe con mayúscula. Para los desarrolladores menos experimentados, puede transmitir que está bien ser desordenado e inconsistente en términos de estilo.O lo mismo, con una sintaxis ligeramente diferente (más amigable con la OMI):
Por cierto, con mysql el uso de combinaciones es casi siempre mucho más rápido que las subconsultas ...
fuente
USING
: stackoverflow.com/questions/11366006/mysql-on-vs-using¡También puedes usar ALIAS como este, funciona, solo lo usé en mi base de datos! t es la tabla necesita eliminar de!
fuente
Estoy más acostumbrado a la solución de subconsulta para esto, pero no lo he probado en MySQL:
fuente
MySQL DELETE registros con JOIN
Generalmente usa INNER JOIN en la instrucción SELECT para seleccionar registros de una tabla que tenga registros correspondientes en otras tablas. También podemos usar la cláusula INNER JOIN con la declaración DELETE para eliminar registros de una tabla y también los registros correspondientes en otras tablas, por ejemplo, para eliminar registros de tablas T1 y T2 que cumplan una condición particular, use la siguiente declaración:
Observe que coloca los nombres de tabla T1 y T2 entre DELETE y FROM. Si omite la tabla T1, la instrucción DELETE solo elimina registros en la tabla T2, y si omite la tabla T2, solo se eliminan los registros en la tabla T1.
La condición de unión T1.key = T2.key especifica los registros correspondientes en la tabla T2 que deben eliminarse.
La condición en la cláusula WHERE especifica qué registros en T1 y T2 deben eliminarse.
fuente
Eliminar tabla individual:
Para eliminar entradas de la
posts
tabla:Para eliminar entradas de la
projects
tabla:Para eliminar entradas de la
clients
tabla:Eliminar varias tablas:
Para eliminar entradas de varias tablas de los resultados combinados, debe especificar los nombres de las tablas
DELETE
como una lista separada por comas:Suponga que desea borrar las entradas de todas las tres tablas (
posts
,projects
,clients
) para un cliente en particular:fuente
Intenta como a continuación:
fuente
Otro método para eliminar usando una sub selección que es mejor que usar
IN
seríaWHERE
EXISTS
Una razón para usar esto en lugar de la combinación es que a
DELETE
conJOIN
prohíbe el uso deLIMIT
. Si desea eliminar en bloques para no producir bloqueos de tabla completos, puede agregarLIMIT
esteDELETE WHERE EXISTS
método.fuente
posts
dentro de EXISTS () es el mismo delposts
que se eliminan las filas. (En mi humilde opinión de todos modos)DELETE p FROM posts p WHERE EXISTS ( SELECT 1 FROM projects WHERE projects.client_id = p.client_id);
BORRAR registros de una tabla:
BORRAR REGISTROS DE ambas tablas:
fuente
Si unirse no funciona para usted, puede probar esta solución. Es para eliminar registros huérfanos de t1 cuando no se usan claves foráneas + condiciones específicas de where. Es decir, elimina registros de la tabla1, que tienen el campo "código" vacío y que no tienen registros en la tabla2, que coinciden con el campo "nombre".
fuente
Prueba esto,
fuente
- Tenga en cuenta que no puede usar un alias sobre la tabla donde necesita eliminar
fuente