inner - mysql workbench result grid not showing
Eliminar con Join en MySQL (13)
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 tienen el client_id
pasado.
Esto no está funcionando ahora porque no se eliminan publicaciones.
¡También puedes usar ALIAS de esta manera! ¡Simplemente lo usé en mi base de datos! t es la tabla necesita eliminar de!
DELETE t FROM posts t
INNER JOIN projects p ON t.project_id = p.project_id
AND t.client_id = p.client_id
- Tenga en cuenta que no puede usar un alias sobre la tabla donde necesita eliminar
DELETE tbl_pagos_activos_usuario
FROM tbl_pagos_activos_usuario, tbl_usuarios b, tbl_facturas c
Where tbl_pagos_activos_usuario.usuario=b.cedula
and tbl_pagos_activos_usuario.cod=c.cod
and tbl_pagos_activos_usuario.rif=c.identificador
and tbl_pagos_activos_usuario.usuario=c.pay_for
and tbl_pagos_activos_usuario.nconfppto=c.nconfppto
and NOT ISNULL(tbl_pagos_activos_usuario.nconfppto)
and c.estatus=50
Dado que está seleccionando varias tablas, la tabla a eliminar ya no es ambigua. Necesitas seleccionar :
delete posts from posts
inner join projects on projects.project_id = posts.project_id
where projects.client_id = :client_id
En este caso, table_name1
y table_name2
son la misma tabla, así que esto funcionará:
delete projects from posts inner join [...]
Incluso puedes eliminar de ambas tablas si quisieras:
delete posts, projects from posts inner join [...]
Tenga en cuenta que el order by
y el limit
no funcionan para las eliminaciones de varias tablas .
También tenga en cuenta que si declara un alias para una tabla, debe usar el alias cuando haga referencia a la tabla:
delete p from posts as p inner join [...]
Contribuciones de Carpetsmoker y etc.
Estoy más acostumbrado a la solución de subconsultas a esto, pero no lo he probado en MySQL:
DELETE FROM posts
WHERE project_id IN (
SELECT project_id
FROM projects
WHERE client_id = :client_id
);
Intenta como a continuación:
DELETE posts.*,projects.*
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
MySQL DELETE registros con JOIN
Por lo general, se usa INNER JOIN en la instrucción SELECT para seleccionar registros de una tabla que tienen registros correspondientes en otras tablas. También podemos usar la cláusula INNER JOIN con la instrucció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 con una condición particular, use la siguiente declaración:
DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition
Observe que coloca los nombres de tabla T1 y T2 entre BORRAR y DESDE. Si omite la tabla T1, la instrucción DELETE solo borra los registros de la tabla T2 y, si omite la tabla T2, solo se eliminarán los registros de 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 ser eliminados.
O lo mismo, con una sintaxis ligeramente diferente (más amigable con la OMI):
DELETE FROM posts
USING posts, projects
WHERE projects.project_id = posts.project_id AND projects.client_id = :client_id;
Por cierto, con mysql usar uniones es casi siempre una forma más rápida que las subconsultas ...
Otro método para eliminar usando una selección secundaria que es mejor que usar IN
sería WHERE
EXISTS
DELETE FROM posts
WHERE EXISTS ( SELECT 1
FROM projects
WHERE projects.client_id = posts.client_id);
Una razón para usar esto en lugar de la unión es que el DELETE
with JOIN
prohíbe el uso de LIMIT
. Si desea eliminar en bloques para no producir bloqueos de tabla completos, puede agregar LIMIT
utilizando este método DELETE WHERE EXISTS
.
Prueba esto,
DELETE posts.*
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id
Si unirse no funciona para usted, puede probar esta solución. Es para eliminar registros huérfanos de t1 cuando no se utilizan claves externas + condición específica de donde. Es decir, elimina registros de la tabla 1, que tienen un "código" de campo vacío y que no tienen registros en la tabla 2, que coinciden con el campo "nombre".
delete table1 from table1 t1
where t1.code = ''''
and 0=(select count(t2.name) from table2 t2 where t2.name=t1.name);
Solo debe especificar que desea eliminar las entradas de la tabla de posts
:
DELETE posts
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id
EDITAR: Para más información puedes ver esta respuesta alternativa.
Eliminar tabla única:
Para borrar entradas de la tabla de posts
:
DELETE ps
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
Para borrar entradas de la tabla de projects
:
DELETE pj
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
Para borrar entradas de la tabla de clients
:
DELETE C
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
Eliminar varias tablas:
Para eliminar entradas de varias tablas de los resultados unidos, debe especificar los nombres de las tablas después de DELETE
como lista separada por comas:
Supongamos que desea eliminar las entradas de las tres tablas ( posts
, projects
, clients
) para un cliente en particular:
DELETE C,pj,ps
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id
mysql> INSERT INTO tb1 VALUES(1,1),(2,2),(3,3),(6,60),(7,70),(8,80);
mysql> INSERT INTO tb2 VALUES(1,1),(2,2),(3,3),(4,40),(5,50),(9,90);
ELIMINAR registros DE una tabla:
mysql> DELETE tb1 FROM tb1,tb2 WHERE tb1.id= tb2.id;
ELIMINAR REGISTROS DE ambas tablas:
mysql> DELETE tb2,tb1 FROM tb2 JOIN tb1 USING(id);