Szukaj…


Składnia

  • USUŃ [LOW_PRIORITY] [SZYBKO] [IGNORUJ] Z tabeli [GDZIE warunki] [ZAMÓWIENIE WEDŁUG wyrażenia [ASC | DESC]] [LIMIT liczba_wierszy]; /// Składnia usuwania wierszy z pojedynczej tabeli

Parametry

Parametr Detale
NISKI PRIORYTET Jeśli podano LOW_PRIORITY , usuwanie będzie opóźnione, dopóki nie zostaną odczytane żadne procesy z tabeli
IGNOROWAĆ Jeśli podano IGNORE , wszystkie błędy napotkane podczas usuwania są ignorowane
stół Tabela, z której zamierzasz usunąć rekordy
GDZIE warunki Warunki, które należy spełnić, aby rekordy mogły zostać usunięte. Jeśli nie zostaną podane żadne warunki, wszystkie rekordy z tabeli zostaną usunięte
ORDER BY expression Jeśli podano ORDER BY , rekordy zostaną usunięte w podanej kolejności
LIMIT Kontroluje maksymalną liczbę rekordów do usunięcia z tabeli. Podane number_rows zostaną usunięte.

Usuń za pomocą klauzuli Where

DELETE FROM `table_name` WHERE `field_one` = 'value_one'

Spowoduje to usunięcie wszystkich wierszy z tabeli, w której zawartość pola field_one dla tego wiersza pasuje do „value_one”

Klauzula WHERE działa w taki sam sposób, jak zaznaczanie, więc można używać takich rzeczy, jak > , < , <> lub LIKE .

Uwaga: Konieczne jest użycie klauzul warunkowych (GDZIE, JAK) w kwerendzie usuwania. Jeśli nie użyjesz żadnych klauzul warunkowych, wszystkie dane z tej tabeli zostaną usunięte.

Usuń wszystkie wiersze z tabeli

DELETE FROM table_name ;

Spowoduje to usunięcie wszystkiego, wszystkich wierszy z tabeli. Jest to najbardziej podstawowy przykład składni. Pokazuje także, że instrukcji DELETE należy naprawdę używać z większą ostrożnością, ponieważ mogą one opróżnić tabelę, jeśli pominięto klauzulę WHERE .

LIMITOWANIE usuwa

DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1

Działa to w taki sam sposób, jak w przykładzie „Usuń z klauzulą Where”, ale zatrzyma usuwanie po usunięciu ograniczonej liczby wierszy.

Jeśli ograniczasz wiersze do usunięcia w ten sposób, pamiętaj, że spowoduje to usunięcie pierwszego wiersza spełniającego kryteria. Może nie być to oczekiwany, ponieważ wyniki mogą wrócić nieposortowane, jeśli nie zostaną wyraźnie uporządkowane.

Usuwa wiele tabel

Instrukcja DELETE w MySQL może używać konstrukcji JOIN , pozwalając również określić, z których tabel należy usunąć. Jest to przydatne, aby uniknąć zagnieżdżonych zapytań. Biorąc pod uwagę schemat:

create table people
(    id int primary key,
    name varchar(100) not null,
    gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');

create table pets
(    id int auto_increment primary key,
    ownerId int not null,
    name varchar(100) not null,
    color varchar(100) not null
);
insert pets(ownerId,name,color) values 
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
ID Nazwa płeć
1 Kathy fa
2) Jan m
3) Paweł m
4 Kim fa
ID ownerId Nazwa kolor
1 1 Wędrowiec beżowy
2) 2) Bąbelki fioletowy
4 1 Rover2 biały

Jeśli chcemy usunąć zwierzaki Paula, oświadczenie

DELETE p2
FROM pets p2
WHERE p2.ownerId in (
    SELECT p1.id
    FROM people p1
    WHERE p1.name = 'Paul');

może być przepisany jako:

DELETE p2    -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';

Usunięto 1 wiersz
Spot został usunięty z Pets

p1 i p2 to aliasy nazw tabel, szczególnie przydatne w przypadku długich nazw tabel i łatwości odczytu.

Aby usunąć zarówno osobę, jak i zwierzaka:

DELETE p1, p2     -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';

2 wiersze usunięte
Spot został usunięty z Pets
Paweł został usunięty z People

klucz obcy

Gdy instrukcja DELETE inwoluuje tabele z ograniczeniem klucza Foreing, optymalizator może przetwarzać tabele w kolejności, która nie jest zgodna z relacją. Dodanie na przykład klucza obcego do definicji pets

ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;

silnik może próbować usunąć wpisy people przed pets , powodując następujący błąd:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))

Rozwiązaniem w tym przypadku jest usunięcie wiersza z people i poleganie na możliwościach InnoDB ON DELETE celu propagowania usunięcia:

DELETE FROM people
WHERE name = 'Paul';

2 wiersze usunięte
Paweł został usunięty z People
Spot jest kasowany kaskadowo ze Pets

Innym rozwiązaniem jest tymczasowe wyłączenie sprawdzania kluczy Foreing:

SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;

Podstawowe usuwanie

DELETE FROM `myTable` WHERE `someColumn` = 'something'

Klauzula WHERE jest opcjonalna, ale bez niej wszystkie wiersze są usuwane.

DELETE vs TRUNCATE

TRUNCATE tableName;

Spowoduje to usunięcie wszystkich danych i zresetowanie indeksu AUTO_INCREMENT . Jest to o wiele szybsze niż DELETE FROM tableName w ogromnym zestawie danych. Może być bardzo przydatny podczas programowania / testowania.

Gdy obcinasz tabelę, SQL Server nie usuwa danych, upuszcza tabelę i odtwarza ją, w ten sposób zwalniając strony, więc istnieje szansa na odzyskanie obciętych danych przed stronami, w których zostały zastąpione. (Nie można natychmiast odzyskać miejsca dla innodb_file_per_table=OFF .)

USUŃ Multi-table

MySQL pozwala określić, z której tabeli należy usunąć pasujące wiersze

    -- remove only the employees
    DELETE e
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'
    -- remove employees and department
    DELETE e, d
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'
    -- remove from all tables (in this case same as previous)
    DELETE
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow