수색…


통사론

  • [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 개의 행이 삭제되었습니다.
애완 동물에서 스팟이 삭제되었습니다.

p1p2 는 테이블 이름에 대한 별칭이며 특히 긴 테이블 이름과 읽기 쉬움에 유용합니다.

사람과 애완 동물을 모두 없애려면 다음과 같이하십시오.

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 으로부터 행을 삭제하고 InnoDBON 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'


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow