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