수색…
통사론
- [LOW_PRIORITY] DELETE [QUICK] [무시] FROM table [WHERE 조건] [ORDER BY expression [ASC | DESC]] [LIMIT number_rows]; /// 단일 테이블에서 행을 삭제하기위한 구문
매개 변수
매개 변수 | 세부 |
---|---|
낮은 우선 순위 | LOW_PRIORITY 가 제공되면 테이블에서 읽는 프로세스가 없어 질 때까지 삭제가 지연됩니다 |
IGNORE | IGNORE 가 제공되면 삭제 중에 발생한 모든 오류는 무시됩니다. |
표 | 레코드를 삭제할 테이블 |
어디 조건 | 삭제할 레코드에 대해 충족해야하는 조건. 조건이 제공되지 않으면 테이블의 모든 레코드가 삭제됩니다 |
ORDER BY 식 | ORDER BY 가 제공되면 레코드는 지정된 순서대로 삭제됩니다. |
한도 | 테이블에서 삭제할 최대 레코드 수를 제어합니다. 주어진 number_rows 가 삭제됩니다. |
Where 절로 삭제
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
그러면 해당 행의 field_one
내용이 'value_one'과 일치하는 테이블의 모든 행이 삭제됩니다.
WHERE
절은 select와 같은 방식으로 작동하므로 >
, <
, <>
또는 LIKE
와 같은 항목을 사용할 수 있습니다.
주의 : 삭제 질의에는 조건절 (WHERE, LIKE)을 사용해야합니다. 조건절을 사용하지 않으면 해당 테이블의 모든 데이터가 삭제됩니다.
테이블에서 모든 행 삭제
DELETE FROM table_name ;
이렇게하면 테이블의 모든 행이 모두 삭제됩니다. 구문의 가장 기본적인 예입니다. 또한 WHERE
절이 생략 된 경우 테이블을 비울 수 있으므로 DELETE
문을 실제로 사용할 때주의해야합니다.
LIMITing 삭제
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
이것은 'Where 절로 삭제'예제와 같은 방식으로 작동하지만 제한된 수의 행이 제거되면 삭제를 중지합니다.
이와 같이 삭제할 행을 제한하는 경우 조건과 일치하는 첫 번째 행이 삭제됩니다. 명시 적으로 명령을 내리지 않은 경우 결과가 정렬되지 않은 상태로 되돌아 올 수 있으므로 예상 한 결과가 아닐 수 있습니다.
다중 테이블 삭제
MySQL의 DELETE
문은 JOIN
구문을 사용하여 삭제할 테이블을 지정할 수도 있습니다. 중첩 된 쿼리를 피할 때 유용합니다. 주어진 스키마 :
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');
신분증 | 이름 | 성별 |
---|---|---|
1 | 캐시 | 에프 |
2 | 남자 | 엠 |
삼 | 폴 | 엠 |
4 | 김 | 에프 |
신분증 | ownerId | 이름 | 색깔 |
---|---|---|---|
1 | 1 | 임시 과녁 | 베이지 색 |
2 | 2 | 거품 | 자 |
4 | 1 | 로버 2 | 화이트 |
폴의 애완 동물을 제거하려면
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
다음과 같이 다시 쓸 수 있습니다 :
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 개의 행이 삭제되었습니다.
애완 동물에서 스팟이 삭제되었습니다.
p1
과 p2
는 테이블 이름에 대한 별칭이며 특히 긴 테이블 이름과 읽기 쉬움에 유용합니다.
사람과 애완 동물을 모두 없애려면 다음과 같이하십시오.
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 개의 행이 삭제되었습니다.
애완 동물에서 스팟이 삭제되었습니다.
Paul이 People에서 삭제되었습니다.
외래 키
DELETE 문이 foreing 키 제약 조건이있는 테이블을 포함 할 때 옵티마이 저는 관계를 따르지 않는 순서로 테이블을 처리 할 수 있습니다. 예를 들어 pets
의 정의에 외래 키 추가
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
엔진이 pets
전에 people
으로부터 항목을 삭제하려고 시도 할 수 있으므로 다음과 같은 오류가 발생합니다.
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`))
이 경우의 해결책은 people
으로부터 행을 삭제하고 InnoDB
의 ON DELETE
기능을 사용하여 삭제를 전달하는 것입니다.
DELETE FROM people
WHERE name = 'Paul';
2 개의 행이 삭제되었습니다.
Paul이 People에서 삭제되었습니다.
애완 동물의 계단에서 자리가 삭제되었습니다.
또 다른 해결책은 포어 링 키 검사를 일시적으로 비활성화하는 것입니다.
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;
기본 삭제
DELETE FROM `myTable` WHERE `someColumn` = 'something'
WHERE
절은 선택 사항이지만 모든 행이 삭제됩니다.
DELETE 대 TRUNCATE
TRUNCATE tableName;
그러면 모든 데이터가 삭제 되고 AUTO_INCREMENT
인덱스가 재설정됩니다. 그것은 거대한 데이터 세트의 DELETE FROM tableName
보다 훨씬 빠릅니다. 개발 / 테스트 중에 매우 유용 할 수 있습니다.
테이블을 자를 때 SQL 서버는 데이터를 삭제하지 않고 테이블을 삭제하고 다시 생성하므로 페이지를 할당 해제하여 덮어 쓰기 된 페이지보다 먼저 잘린 데이터를 복구 할 수 있습니다. (이 공간은 innodb_file_per_table=OFF
위해 즉시 회수 될 수 없습니다.)
다중 테이블 DELETE
MySQL은 일치하는 행을 삭제해야하는 테이블을 지정할 수 있습니다.
-- 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'