DDL
1. CREATE TABLE 구문의 기본 형태
1
2
3
4
5
CREATE TABLE table1(
field1 INTEGER PRIMARY KEY NOT NULL,
field2 TEXT,
FOREIGN KEY(field1) REFERENCES table2(field1) ON UPDATE CASCADE
)
- 기본적으로 CREATE TABLE 테이블명(속성명 변수형, ..., 제약조건(속성명))의 형식을 갖고 있다. 제약조건은 속성명에 대한 명세를 적은 다음에 적기도 하지만, 속성명에 관한 명세(변수형)를 적은 후 그 뒤에 나열하여 적을 수도 있다.
- 새로운 schema를 정의하는 대신, AS를 사용하여 CREATE TABLE table2 AS SELECT * FROM table1와 같이 기존 테이블을 이용해 새 테이블을 만들 수도 있다.
2. CREATE TABLE 구문에서 제약조건 쓰기
1) NOT NULL
- 그 속성값으로 NULL을 허용하지 않는다.
2) UNIQUE
- 그 속성값으로 중복을 허용하지 않는다. 이 키워드를 추가하면 그 컬럼은 unique key(고유키)가 된다. (참고로, 테이블의 모든 레코드를 서로 고유하게 구별할 수 있게 하는 모든 컬럼의 조합을 super key, 그 중 최소 개수 컬럼으로 레코드를 고유하게 구별할 수 있게 하는 컬럼 조합을 candidate key라 하는데, 고유키는 이 candidate key에 포함되는 개념이다.)
3) PRIMARY KEY
- 그 속성을 기본키로 지정한다. 테이블 당 하나의 기본키만 지정할 수 있다. 기본키는 NULL값을 가질 수 없다(개체무결성).
4) FOREIGN KEY
- 테이블 내에서 다른 테이블의 기본키 또는 고유키를 참조하게 하는 컬럼을 외래키라 한다. schema에 이 키워드를 쓰면 그 컬럼을 외래키로 지정할 수 있으며, 이렇게 하면 (1)이 컬럼은 그것이 참조하는 컬럼이 가질 수 있는 값만 가질 수 있고 (2)그것이 참조하는 기본키 값만을 단독으로 변경하는 것은 무시된다(참조 무결성). (단, 기본키 값은 그대로 두고 외래키 값을 임의로 변경하는 것은 허용된다.)
- 이 컬럼이 참조하는 다른 테이블의 컬럼은 REFERENCES 테이블명(속성명) 형식을 갖는 구문으로 지정할 수 있다.
- 외래키를 지정하는 경우 참조무결성 원칙에 따라 그것이 참조하는 기본키 값만을 단독으로 변경하는 것은 불가능한데, 다음과 같은 방식을 사용하면 기본키 값을 변경할 수 있다.
-
트랜잭션(
BEGIN; ....; COMMIT;)으로 두 값을 동시에 업데이트 한다. -
외래키에 관한 스키마를 쓸 때
FOREIGN KEY REFERENCES ...뒤에 다음 옵션을 추가하면 기본키 레코드의 업데이트/삭제 쿼리가 실행될 때의 이 외래키에 관한 기본 동작을 정의할 수 있다.-
ON DELETE,ON UPDATE-
CASCADE: 그 외래키가 참조하는 테이블의 속성값이 변화하면 그 변화를 그대로 그 외래키의 값에도 반영한다. -
SET NULL/DEFAULT: 변화하면 그 외래키의 값을NULL또는 그 외래키의DEFAULT로 설정한 값으로 설정한다. -
RESTRICT: 이 테이블의 외래키의 값이 현재 존재하면 그 외래키에 의해 참조되는 테이블의 속성값을 수정/삭제할 수 없다.
-
-
5) CHECK (조건식)
- 그 속성값으로 조건식을 참으로 하는 입력값만을 허용한다.
- 둘 이상의 속성명으로 이루어진 조건식을 쓸 수도 있다.
6) DEFAULT 값
- INSERT INTO로 튜플을 입력할 시 그 속성값이 지정되지 않았다면 여기서 지정한 값을 DEFAULT로 설정한다.
3. CREATE INDEX 구문의 기본 형태
1
CREATE INDEX index1 ON table1(field1, field2)
- INDEX에 대해서도 테이블과 마찬가지로 SELECT 쿼리로 값을 가져올 수 있다.
- INDEX 자체에 대한 INSERT, DELETE, UPDATE는 가능하나 그 튜플의 값을 직접 수정할 수는 없다.
4. CREATE DOMAIN 구문의 기본 형태
1
CREATE DOMAIN domain1 AS INTEGER DEFAULT 10 NOT NULL CHECK(VALUE>5 AND VALUE<10)
- DOMAIN은 사용자가 임의로 정의하는 일종의 변수형으로, CREATE TABLE 구문에서 변수형을 쓰는 자리에 대신 쓸 수 있다.
- MySQL 등 몇몇 DBMS에서는 지원하지 않는다.
5. ALTER TABLE
1) 속성 추가/수정
1
2
3
ALTER TABLE table1 ADD field3 INTEGER
ALTER TABLE table1 MODIFY field1 TEXT
ALTER TABLE table1 DROP field1
2) 제약조건 추가/수정
1
2
3
4
ALTER TABLE table1 ADD FOREIGN KEY(field2) REFERENCES table3(field1)
ALTER TABLE table1 ADD CONSTRAINT constraint1 CHECK(field1 < 10)
ALTER TABLE table1 MODIFY CONSTRAINT constraint1 CHECK(field1 > 10)
ALTER TABLE table1 DROP CONSTRAINT constraint1
- CONSTRAINT 예약어는 사용하지 않아도 제약조건을 추가하는 것이 가능하나, 이를 사용할 경우 제약조건에 이름을 지정할 수 있으며 그 이름을 호출하여 그 제약조건 내용을 변경하거나 삭제할 수 있다.
6. DROP TABLE
1
DROP TABLE table1