콘텐츠로 이동

DELETE

DELETE#

구문#

delete ::=#

delete_image179

hints ::=

from_clause ::=#

from_clause_image180

where_clause ::=#

where_clause_image181

returning_clause ::=#

returning_clause

limit_clause ::=#

limit_clause_

multiple_delete ::=#

multiple_delete

tbl_ref ::=#

tbl_ref

one_table ::=#

one_table

join_table ::=#

join_table

전제 조건#

SYS 사용자, 테이블 소유자, DELETE ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 DELETE 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블의 레코드를 삭제할 수 있다.

뷰의 레코드를 삭제할 경우, 사용자는 베이스 테이블에 대해 위와 동일한 권한을 가져야 한다.

설명#

조건을 만족하는 레코드를 해당 테이블에서 삭제하는 구문이다. 또한 이 구문으로 특정 파티션에 있는 데이터를 삭제할 수도 있다.

WHERE 절은 SELECT구문의 WHERE 절과 동일하다. WHERE 절을 생략하면 테이블의 모든 데이터가 삭제된다.

user_name#

레코드를 삭제할 테이블의 소유자 이름을 명시한다. 생략하면 Altibase는 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다.

tbl_name#

삭제될 레코드를 포함한 테이블 이름을 명시한다.

view_name#

레코드가 삭제될 뷰의 이름을 명시한다.

subquery#

레코드를 삭제하려는 뷰를 서브쿼리로 명시한다.

returning_clause#

returning 절은 DML 문에 의해 영향을 받은 레코드를 조회한다.

expr#

각 expr는 DML 문에 의해 영향을 받는 칼럼의 이름이거나 칼럼 타입과 호환되는 데이터 표현식이어야 한다.

INTO#

INTO 절은 변경된 레코드의 값들이 각 값에 대응하는 variable_name 변수로 저장될 것을 지시한다.

variable_name#

각 variable_name은 조회된 expr 값을 저장할 호스트 변수 또는 PSM 변수이다. RECORD 타입의 변수를 사용하는 경우를 제외하면, 변수의 개수는 expr 리스트의 expr 개수와 동일해야 한다.

호스트 변수 또는 PSM 변수의 타입은 대응하는 expr의 타입과 호환되어야 한다.

참고: iSQL에서는 변수 이름 앞에 ':'을 붙여 사용해야 한다.

Returning 절의 제약 사항:

  • UPDATE, DELETE, 및 INSERT문의 경우, 각 expr에는 aggregate 함수가 올 수 없다.
  • 이 절은 테이블에 대해서만 사용할 수 있다.
  • 이 절로 LOB 타입을 조회할 수 없다.
  • expr에 별칭(alias) 또는 부질의(subquery)가 올 수 없다.
  • expr에 시퀀스를 사용할 수 없다.

참고: PSM 내에서 BULK COLLECT 절을 사용해서 한꺼번에 여러 행을 collection 변수로 반환할 수 있다. 이에 대한 자세한 내용은 Stored Procedures Manual을 참고하라.

multiple_delete#

join 조건을 만족하는 레코드가 tbl_name에 지정된 테이블에서 삭제하는 구문이다.

multiple delete 제약 사항:

  • limit_clause 와 returning_clause 를 사용할 수 없다.
  • dictionary table 을 사용할 수 없다.
  • full outer join 을 사용할 수 없다.

tbl_ref#

multiple update 를 하기 위한 table 을 명시한다.

one_table#

한 개의 table이거나 혹은 view 를 명시한다.

join_table#

table 사이의 join 조건을 명시한다.

HINTS 옵션#

힌트의 문법과 자세한 설명은 2장의 "힌트 구문"과 "힌트 목록"을 참고하기 바란다.

예제#

단순 데이터 삭제#

<질의> 테이블의 모든 데이터를 삭제하라.

DELETE FROM orders;

<질의> T1 테이블의 P2 파티션의 모든 데이터를 삭제한다

DELETE FROM T1 PARTITION (P2);

<질의> 직원 'William'이 받은 주문들을 삭제한다.

DELETE
  FROM orders
 WHERE eno = (SELECT eno
                FROM employees
               WHERE e_firstname = 'William');

조인 뷰의 데이터 삭제#

<질의> employees와 departments 테이블의 조인 뷰를 생성한 후, 'BUSINESS DEPT' 부서에 속한 사원을 삭제한다. employees 테이블의 데이터 삭제 전후 행 개수를 비교하면, employees 테이블의 데이터가 삭제된 것을 확인할 수 있다.

CREATE VIEW simple_emp AS
SELECT e.eno
     , e.e_lastname
     , e.salary
     , d.dname
  FROM employees e
     , departments d
 WHERE e.dno = d.dno;
SELECT * FROM simple_emp;
ENO         E_LASTNAME            SALARY      DNAME
-----------------------------------------------------------------------------------
3           Kobain                2000        RESEARCH DEVELOPMENT DEPT 1
16          Chen                  2300        RESEARCH DEVELOPMENT DEPT 1
6           Momoi                 1700        RESEARCH DEVELOPMENT DEPT 2
13          Jones                 980         RESEARCH DEVELOPMENT DEPT 2
10          Bae                   4000        SOLUTION DEVELOPMENT DEPT
11          Liu                   2750        SOLUTION DEVELOPMENT DEPT
14          Miura                 2003        SOLUTION DEVELOPMENT DEPT
15          Davenport             1000        SOLUTION DEVELOPMENT DEPT
17          Fubuki                1400        QUALITY ASSURANCE DEPT
4           Foster                1800        CUSTOMERS SUPPORT DEPT
1           Moon                              PRESALES DEPT
5           Ghorbani              2500        PRESALES DEPT
8           Wang                              MARKETING DEPT
9           Diaz                  1200        MARKETING DEPT
18          Huxley                1900        MARKETING DEPT
7           Fleischer             500         BUSINESS DEPT
12          Hammond               1890        BUSINESS DEPT
19          Marquez               1800        BUSINESS DEPT
20          Blake                             BUSINESS DEPT
19 rows selected.
SELECT COUNT(*) FROM EMPLOYEES;
COUNT
-----------------------
20
1 row selected.
DELETE FROM simple_emp WHERE dname='BUSINESS DEPT';

SELECT COUNT(*) FROM employees;
COUNT
-----------------------
16
1 row selected.

Multiple table 데이터 삭제#

<질의> employees와 departments 테이블의 'MARKETING DEPT' 부서에 속한 사원을 삭제한다.

iSQL> DELETE e, d FROM employees e, departments d WHERE e.dno = d.dno and d.dname = 'MARKETING DEPT';
4 rows deleted.

iSQL> select count(*) from  employees e, departments d WHERE e.dno = d.dno and d.dname = 'MARKETING DEPT';
COUNT
-----------------------
0
1 row selected.

Returning 절을 사용한 삭제#

<질의> 삭제된 행의 값을 출력 바인드 변수인 :v1, :v2로 반환하도록 한다.

iSQL> create table employees ( eno integer, ename varchar(20));
Create success.

iSQL> var v1 output integer;
iSQL> var v2 output varchar(30);

iSQL> insert into employees values (1, 'jake');
iSQL> insert into employees values (2, 'nikita');
iSQL> insert into employees values (3, 'dana');

iSQL> prepare delete from employees where eno=2 return eno, ename into :v1, :v2;
1 row deleted.

iSQL> print var
[ HOST VARIABLE ]
-------------------------------------------------------
NAME                 TYPE                 VALUE
-------------------------------------------------------
V1                   INTEGER              2
V2                   VARCHAR(30)          nikita