CodeGym /행동 /SQL SELF /테이블 만들고 수정할 때 흔히 하는 실수들

테이블 만들고 수정할 때 흔히 하는 실수들

SQL SELF
레벨 18 , 레슨 4
사용 가능

안녕, 미래의 PostgreSQL 고수들! 오늘 주제는 아마도 프로그래밍에서 제일 중요한 스킬 중 하나인 실수 피하기에 관한 거야. 사실 실수를 완전히 피할 순 없지, 특히 SQL을 이제 막 배우기 시작했다면 더더욱. 하지만 흔한 실수들은 금방 익힐 수 있어. 이건 마치 모서리 많은 방을 어둠 속에서 걷는 거랑 비슷해: 몇 번 부딪히고 나면 뭐가 어디 있는지 알게 되지. 내가 테이블 만들고 수정할 때 "날카로운 모서리" 피해가는 법 알려줄게.

실수 1: 데이터 타입 잘못 고르기

데이터 타입 다루는 건 자물쇠에 맞는 열쇠 고르는 거랑 비슷해. 잘못된 "열쇠"인 데이터 타입을 쓰면 테이블이 제대로 동작 안 하거나 비효율적이 될 수 있어.

실수 예시:

전화번호 저장하려고 컬럼을 만들 때 습관적으로 INTEGER 타입을 고른다고 해보자. 숫자니까 그럴듯해 보이지만, INTEGER는 이런 데이터에 안 맞아:

  • 0으로 시작하는 경우 (0123456789가 그냥 123456789로 됨).
  • "+"나 공백 같은 문자 포함하는 경우.
-- 잘못된 예:
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    phone_number INTEGER -- 오잉
);

-- 올바른 예:
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    phone_number VARCHAR(15) -- 모든 형식의 번호 저장 가능
);

어떻게 피하지?
저장할 데이터의 특성을 잘 생각하고 타입을 골라. 헷갈리면 PostgreSQL 공식 데이터 타입 문서 참고해봐.

실수 2: NOT NULL, CHECK, UNIQUE 제약조건 무시하기

제약조건은 데이터 무결성 지켜주는 역할을 해. 이걸 빼먹으면, 테이블에 없어야 할 빈 값들이 들어가서 난장판이 될 수 있어.

실수 예시: 학생 정보 저장하는 테이블을 만들면서 이름이랑 나이가 필수라는 걸 깜빡했다고 해보자.

-- 잘못된 예:
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INTEGER
);

INSERT INTO students (name, age) VALUES (NULL, NULL); -- 어라, 이게 뭐야?!

올바른 예:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL, -- 이름은 필수
    age INTEGER CHECK (age > 0) -- 나이는 양수여야 함
);

어떻게 피하지?
필수 필드는 항상 제약조건을 걸어줘. 이건 일종의 "안전장치"라서 문제 있는 데이터가 들어오는 걸 막아줘.

실수 3: 유니크 문제

가끔 유니크해야 하는 컬럼에 UNIQUE 제약조건을 안 걸고 넘어갈 때가 있어. 그러면 중복 데이터가 생기지.

실수 예시: 이메일 주소 저장하는 테이블을 만들면서 UNIQUE를 빼먹었다고 해보자.

-- 잘못된 예:
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(100)
);

INSERT INTO users (email) VALUES ('user@example.com');
INSERT INTO users (email) VALUES ('user@example.com'); -- 이미 있는 이메일이야!

올바른 예:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(100) UNIQUE -- 유니크한 이메일
);

어떻게 피하지?
값이 유니크해야 한다면 꼭 UNIQUE를 추가해. 좀 더 유연하게 하고 싶으면 CONSTRAINT에 이름을 붙여서 제약조건을 구분할 수도 있어:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(100),
    CONSTRAINT unique_email UNIQUE (email)
);

실수 4: 테이블 수정(ALTER TABLE)할 때 실수

ALTER TABLE 쓸 때는 특히 조심해야 해, 이미 데이터가 들어가 있는 경우엔 더더욱. 예를 들어, 컬럼에 허용되는 값 신경 안 쓰고 제약조건을 추가하면 기존 데이터 때문에 에러가 날 수 있어.

실수 예시: 이미 존재하는 컬럼에 NOT NULL 제약조건을 추가하려고 하는데, 그 컬럼에 NULL 값이 들어가 있으면?

-- 잘못된 예:
ALTER TABLE students ALTER COLUMN name SET NOT NULL; -- 에러!

테이블에 이미 NULL 값이 있으면 PostgreSQL이 제약조건 추가를 허락하지 않아.

어떻게 해야 하지?

제약조건 추가 전에 데이터가 조건에 맞는지 꼭 확인해. 예를 들면:

UPDATE students SET name = 'Unknown' WHERE name IS NULL;
ALTER TABLE students ALTER COLUMN name SET NOT NULL;

실수 5: 확인 없이 테이블이나 데이터 삭제하기

DROP TABLE로 테이블을 지우거나 DELETE로 데이터를 지우는 건 되돌릴 수 없는 행동이야. 그래서 삭제 전에 꼭 뭘 지우는지 확인해야 해.

실수 예시:

DROP TABLE courses; -- 어, 이 테이블 아니었는데!

어떻게 피하지?

psql에서 \dt 명령어로 테이블 목록을 확인하고, 진짜 지울 테이블이 맞는지 체크해.

아니면 DROP TABLE IF EXISTS를 써서 없는 테이블 지우려다 에러나는 걸 막을 수도 있어:

DROP TABLE IF EXISTS courses;

실수 6: 임시 테이블 관련 문제

임시 테이블은 세션이 끝나면 사라져. 세션 끝난 뒤에 임시 테이블을 쓰려고 하면 에러가 나지.

실수 예시:

CREATE TEMP TABLE temp_students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

-- 세션 끝내고 나서...
SELECT * FROM temp_students; -- 에러: 테이블이 더 이상 없어!

어떻게 피하지?

세션 사이에 써야 하는 임시 데이터는 일반 테이블에 저장하거나, 임시 테이블은 한 세션 안에서만 쓴다는 걸 문서로 남겨둬.

실수 7: 테스트할 때 제약조건 깜빡하기

개발할 때 "나중에 제약조건 추가하지 뭐" 하고 넘어가다가, 실제로는 "나중"이 영영 안 올 때가 많아.

실수 예시:

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50)
);

-- 데이터 삽입:
INSERT INTO test_table (name) VALUES ('Duplicate Name');
INSERT INTO test_table (name) VALUES ('Duplicate Name'); -- 문제 시작...

어떻게 피하지?

테스트할 때도 처음부터 제약조건을 걸어서 테이블을 만들어:

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) UNIQUE -- 두통 예방!
);
1
설문조사/퀴즈
테이블 구조 변경하기, 레벨 18, 레슨 4
사용 불가능
테이블 구조 변경하기
테이블 구조 변경하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION