Tengo dos tablas en MySQL
#messages table :
messageid
messagetitle
.
.
#usersmessages table
usersmessageid
messageid
userid
.
.
Ahora, si quiero eliminar de la tabla de mensajes, está bien. Pero cuando elimino mensaje por messageid, el registro todavía existe en usersmessage y tengo que eliminar de estas dos tablas a la vez.
Usé la siguiente consulta:
DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ;
Entonces pruebo
DELETE FROM messages , usersmessages
WHERE messages.messageid = usersmessages.messageid
and messageid='1' ;
Pero estas dos consultas no están cumpliendo esta tarea.
DELETE a.*, b.* FROM messages a LEFT JOIN usersmessages b ON b.messageid = a.messageid WHERE a.messageid = 1
translation: eliminar de la tabla de mensajes donde messageid = 1, si la tabla uersmessages tiene messageid = messageid de la tabla de mensajes , elimina esa fila de la tabla uersmessages .
fuente
Deberías crear un
FOREIGN KEY
conON DELETE CASCADE
:ALTER TABLE usersmessages ADD CONSTRAINT fk_usermessages_messageid FOREIGN KEY (messageid) REFERENCES messages (messageid) ON DELETE CASCADE
, o hacerlo usando dos consultas en una transacción:
START TRANSACTION;; DELETE FROM usermessages WHERE messageid = 1 DELETE FROM messages WHERE messageid = 1; COMMIT;
Sin
InnoDB
embargo, la transacción solo afecta a las tablas.fuente
InnoDB
?Tienes dos opciones:
Primero, haga dos declaraciones dentro de una transacción:
BEGIN; DELETE FROM messages WHERE messageid = 1; DELETE FROM usermessages WHERE messageid = 1; COMMIT;
O bien, podría tener ON DELETE CASCADE configurado con una clave externa. Este es el mejor enfoque.
CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ); CREATE TABLE child ( id INT, parent_id INT, FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE );
Puede leer más sobre ON DELETE CASCADE aquí .
fuente
no es necesario UNIRSE:
DELETE m, um FROM messages m, usersmessages um WHERE m.messageid = 1 AND m.messageid = um.messageid
fuente
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'
fuente
Al OP simplemente le faltan los alias de la tabla después de la eliminación
DELETE t1, t2 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id WHERE t1.id = some_id
fuente
Prueba esto por favor
DELETE FROM messages,usersmessages USING messages INNER JOIN usermessages on (messages.messageid = usersmessages.messageid) WHERE messages.messsageid='1'
fuente
Prueba esto..
DELETE a.*, b.* FROM table1 as a, table2 as b WHERE a.id=[Your value here] and b.id=[Your value here]
Dejo
id
como muestra una columna.Me alegro de que esto ayude. :)
fuente
*
) se representen correctamente, debe sangrar la consulta con 4 espacios al frente.También puede usar así, para eliminar un valor particular cuando ambas columnas tienen 2 o muchas del mismo nombre de columna.
DELETE project , create_test FROM project INNER JOIN create_test WHERE project.project_name='Trail' and create_test.project_name ='Trail' and project.uid= create_test.uid = '1';
fuente
hay otra forma que no se menciona aquí (todavía no probé completamente su rendimiento), puede establecer una matriz para todas las tablas -> filas que desea eliminar como se muestra a continuación
// set your tables array $array = ['table1', 'table2', 'table3']; // loop through each table for($i = 0; $i < count($array); $i++){ // get each single array $single_array = $array[$i]; // build your query $query = "DELETE FROM $single_array WHERE id = 'id'"; // prepare the query and get the connection $data = con::GetCon()->prepare($query); // execute the action $data->execute(); }
entonces podría redirigir al usuario a la página de inicio.
Espero que esto ayude a alguien :)
Gracias
fuente