일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- XML
- AOP
- Spring JDBC
- 마이바티스
- @test
- @JUnit
- @AspectJ
- Framework
- Dependency Injection
- spring aop
- POJO
- java
- Linux
- 프로퍼티
- JDBC TEMPLATE
- Spring Boot
- java spring
- pointcut
- SpringJDBC
- Ubunt
- Di
- 컨테이너
- unix
- @Spring-Test
- spring
- 리눅스
- myBatis
- JdbcTemplate
- spring framework
- STS
- Today
- Total
개키우는개발자 : )
PostgreSQL 테이블 생성 본문
테이블 생성
테이블은 데이터를 담는 그릇으로써 반드시 생성해야만 데이터를 저장 할 수 있습니다.
테이블 생성시 컬럼의 제약 조건
제약조건명 | 설명 |
NOT NULL | 해당 제약 조건이 있는 컬럼은 NULL이 저장될 수 없습니다. |
UNIQUE | 해당 제약 조건이 있는 컬럼의 값은 테이블 내에서 유일해야 합니다.(중복X) |
PRIMARY KEY | 해당 제약 조건이 있는 컬럼의 값은 테이블내에서 유일해야 하고 반드시 NOT NULL 이어야 합니다. |
CHECK | 해당 제약 조건이 있는 컬럼은 지정하는 조건에 맞는 값이 들어가야 합니다. |
REFERENCES | 해당 제약 조건이 있는 컬럼의 값은 참조하는 테이블의 특정 컬럼에 값이 존재해야 합니다. |
실습
- ACCOUNT_TEST 테이블 생성
1. USER_ID는 기본키 이고 NOT NULL이면서 UNIQUE해야 합니다.
2. USERNAME은 UNIQUE하면서 NOT NULL 이어야 합니다.
3. PASSWORD 는 NOT NULL 이어야 합니다.
4. EMAIL 은 UNIQUE하면서 NOT NULL 이어야 합니다.
5. CRETAED_ON은 NOT NULL이어야 합니다.
6. LAST_LOGIN은 NULL 이어도 상관없습니다.
CREATE TABLE ACCOUNT_TEST
(
USER_ID SERIAL PRIMARY KEY,
USERNAME VARCHAR(50) UNIQUE NOT NULL,
PASSWORD VARCHAR(50) NOT NULL,
EMAIL VARCHAR(355) UNIQUE NOT NULL,
CREATED_ON TIMESTAMP NOT NULL,
LAST_LOGIN TIMESTAMP
);
- ROLE_TEST 테이블 생성
1. ROLE_ID는 기본키 이고 NOT NULL 이면서 UNIQUE해야 합니다.
2. ROLE_NAME은 UNIQUE하면서 NOT NULL 이어야 합니다.
CREATE TABLE ROLE_TEST
(
ROLE_ID SERIAL PRIMARY KEY,
ROLE_NAME VARCHAR(255) UNIQUE NOT NULL
);
- ACCOUNT_ROLE_TEST 테이블 생성
1. USER_ID는 NOT NULL 이어야 합니다.
2. ROLE_ID는 NOT NULL 이어야 합니다.
3. GRANT_DATE는 NULL이어도 상관 없습니다.
4. 기본키는 USER_ID , ROLE_ID 로 합니다.
5. ROLE_ID 컬럼은 ROLE_TEST 테이블의 ROLE_ID컬럼을 참조합니다.
6. ROLE_ID 컬럼은 ROLE_TEST 테이블의 ROLE_ID컬럼에 대한 삭제 혹은 변경시 아무것도 하지 않습니다.
7. USER_ID 컬럼은 ACCOUNT_TEST 테이블의 USER_ID컬럼을 참조합니다.
8. USER_ID 컬럼은 ACCOUNT_TEST 테이블의 USER_ID컬럼에 대한 삭제 혹은 변경시 아무것도 하지 않습니다.
CREATE TABLE ACCOUNT_ROLE_TEST
(
USER_ID INTEGER NOT NULL,
ROLE_ID INTEGER NOT NULL,
GRANT_DATE TIMESTAMP WITHOUT TIME ZONE,
PRIMARY KEY (USER_ID,ROLE_ID),
CONSTRAINT ACCOUNT_ROLE_ROLE_ID_FKEY FOREIGN KEY (ROLE_ID)
REFERENCES ROLE_TEST (ROLE_ID) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ACCOUNT_ROLE_USER_ID_FKEY FOREIGN KEY (USER_ID)
REFERENCES ACCOUNT_TEST (USER_ID) MATCH SIMPLE ON
UPDATE NO ACTION ON DELETE NO ACTION
);
조건상 PRIMARY KEY와 UNIQUE NOT NULL은 유일하면서 NOT NULL입니다.
하지만 PRIMARY KEY는 해당 테이블의 기본값 이므로 서로 제약조건 같지만 엄연히 다른 역할을 합니다.
- 테이블 관계
하나의 ROLE_ID 는 여러개의 USER_ID를 가질 수 있고 , 한명의 USER_ID는 여러개의 ROLE_ID를 가질 수 있습니다.
그러하여 N : N (다 대 다) 관계가 형성 됩니다. 그러한 다대다 관계를 이어주는 테이블이 ACCOUNT_ROLE_TEST 테이블 입니다.
- ACCOUNT_TEST 테이블에 데이터 INSERT
INSERT INTO ACCOUNT_TEST VALUES (1,'이름','1234','DBMS@NAVER.COM',CURRENT_TIMESTAMP,NULL);
commit;
- ROLE_TEST 테이블에 데이터 INSERT
INSERT INTO ROLE_TEST VALUES (1,'DBA');
COMMIT;
- ACCOUNT_ROLE_TEST 데이터 INSERT
INSERT INTO ACCOUNT_ROLE_TEST VALUES (1,1,CURRENT_TIMESTAMP);
COMMIT;
- 참조 무결성 ERROR 테스트
1.ACCOUNT_ROLE_TEST 테이블에 데이터 INSERT
INSERT INTO ACCOUNT_ROLE_TEST VALUES (2,1,CURRENT_TIMESTAMP);
ACCOUNT_TEST 테이블에 USER_ID 2번이 없기 때문에 오류가 발생 합니다.
SQL Error [23503]: 오류: "account_role_test" 테이블에서 자료 추가, 갱신 작업이 "account_role_user_id_fkey" 참조키(foreign key) 제약 조건을 위배했습니다
Detail: (user_id)=(2) 키가 "account_test" 테이블에 없습니다.
INSERT INTO ACCOUNT_ROLE_TEST VALUES (1,2,CURRENT_TIMESTAMP);
ROLE_TEST 테이블에 ROLE_ID 2번이 없기 때문에 오류가 발생 합니다.
SQL Error [23503]: 오류: "account_role_test" 테이블에서 자료 추가, 갱신 작업이 "account_role_role_id_fkey" 참조키(foreign key) 제약 조건을 위배했습니다
Detail: (role_id)=(2) 키가 "role_test" 테이블에 없습니다.
INSERT INTO ACCOUNT_ROLE_TEST VALUES (1,1,CURRENT_TIMESTAMP);
이미 존재하는 데이터가 있어 오류가 발생합니다.
SQL Error [23505]: 오류: 중복된 키 값이 "account_role_test_pkey" 고유 제약 조건을 위반함
Detail: (user_id, role_id)=(1, 1) 키가 이미 있습니다.
2.ACCOUNT_TEST 테이블에 데이터 UPDATE,DELETE
UPDATE ACCOUNT_TEST
SET USER_ID = 2
WHERE USER_ID = 1;
이미 참조된 테이블이 존재하므로 ACCOUNT_TEST의 데이터를 수정할 수 없습니다.
SQL Error [23503]: 오류: "account_test" 테이블의 자료 갱신, 삭제 작업이 "account_role_user_id_fkey" 참조키(foreign key) 제약 조건 - "account_role_test" 테이블 - 을 위반했습니다
Detail: (user_id)=(1) 키가 "account_role_test" 테이블에서 여전히 참조됩니다.
DELETE FROM ACCOUNT_TEST
WHERE USER_ID = 1;
삭제 또한 이미 참조하고있는 테이블이 있어 삭제가 불가능합니다.
SQL Error [23503]: 오류: "account_test" 테이블의 자료 갱신, 삭제 작업이 "account_role_user_id_fkey" 참조키(foreign key) 제약 조건 - "account_role_test" 테이블 - 을 위반했습니다
Detail: (user_id)=(1) 키가 "account_role_test" 테이블에서 여전히 참조됩니다.
하지만 업데이트 또는 삭제하는 방법이 없는것이 아니기 때문에 걱정 안하셔도 됩니다!
'PostgreSQL > 데이터 조작 및 테이블 관리' 카테고리의 다른 글
PostgreSQL 테이블 구조 및 이름 변경 (0) | 2019.11.19 |
---|---|
PostgreSQL CREATE TABLE AS SELECT (CTAS) (0) | 2019.11.19 |
PostgreSQL 데이터 타입 (0) | 2019.11.17 |
PostgreSQL IMPORT 작업 (0) | 2019.11.17 |
PostgreSQL EXPORT 작업 (0) | 2019.11.16 |