Mam dwie tabele w MySQL
#messages table :
messageid
messagetitle
.
.
#usersmessages table
usersmessageid
messageid
userid
.
.
Teraz, jeśli chcę usunąć z tabeli wiadomości, wszystko jest w porządku. Ale kiedy usuwam wiadomość według messageid, rekord nadal istnieje na usermessage i muszę usunąć z tych dwóch tabel naraz.
Użyłem następującego zapytania:
DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ;
Potem testuję
DELETE FROM messages , usersmessages
WHERE messages.messageid = usersmessages.messageid
and messageid='1' ;
Ale te dwa zapytania nie wykonują tego zadania.
DELETE a.*, b.* FROM messages a LEFT JOIN usersmessages b ON b.messageid = a.messageid WHERE a.messageid = 1
translacja: usuń z tabeli wiadomości, gdzie identyfikator wiadomości = 1, jeśli tabela uersmessages ma identyfikator wiadomości = identyfikator wiadomości z tabeli , usuń ten wiersz tabeli uersmessages .
źródło
Powinieneś albo utworzyć
FOREIGN KEY
zON DELETE CASCADE
:ALTER TABLE usersmessages ADD CONSTRAINT fk_usermessages_messageid FOREIGN KEY (messageid) REFERENCES messages (messageid) ON DELETE CASCADE
lub zrób to za pomocą dwóch zapytań w transakcji:
START TRANSACTION;; DELETE FROM usermessages WHERE messageid = 1 DELETE FROM messages WHERE messageid = 1; COMMIT;
Transakcja dotyczy jednak tylko
InnoDB
tabel.źródło
InnoDB
?Masz dwie możliwości:
Najpierw wykonaj dwie instrukcje wewnątrz transakcji:
BEGIN; DELETE FROM messages WHERE messageid = 1; DELETE FROM usermessages WHERE messageid = 1; COMMIT;
Lub możesz ustawić ON DELETE CASCADE z kluczem obcym. To jest lepsze podejście.
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 );
Możesz przeczytać więcej o ON DELETE CASCADE tutaj .
źródło
nie ma potrzeby ŁĄCZENIA:
DELETE m, um FROM messages m, usersmessages um WHERE m.messageid = 1 AND m.messageid = um.messageid
źródło
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'
źródło
W OP brakuje tylko aliasów tabeli po usunięciu
DELETE t1, t2 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id WHERE t1.id = some_id
źródło
Spróbuj tego, proszę
DELETE FROM messages,usersmessages USING messages INNER JOIN usermessages on (messages.messageid = usersmessages.messageid) WHERE messages.messsageid='1'
źródło
Spróbuj tego..
DELETE a.*, b.* FROM table1 as a, table2 as b WHERE a.id=[Your value here] and b.id=[Your value here]
Podałem
id
jako próbną kolumnę.Cieszę się, że to pomaga. :)
źródło
*
) były renderowane poprawnie, musisz wciąć zapytanie z 4 spacjami przed nim.Możesz również użyć w ten sposób, aby usunąć określoną wartość, gdy obie kolumny mają 2 lub wiele takich samych nazw kolumn.
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';
źródło
jest inny sposób, o którym tutaj nie wspomniano (nie testowałem jeszcze w pełni jego wydajności), możesz ustawić tablicę dla wszystkich tabel -> wiersze, które chcesz usunąć, jak poniżej
// 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(); }
wtedy możesz przekierować użytkownika na stronę główną.
mam nadzieję, że to komuś pomoże :)
Dzięki
źródło