SQL DDL 내보내기 가이드 | Dr.ERD로 PostgreSQL 18 스키마 만들기
이 가이드는 무료 ERD 만들기와 Mermaid 가져오기에서 만든 회원·주문·주문 항목 3개 테이블 모델을 SQL DDL 파일로 내보내는 순서를 설명합니다. Dr.ERD는 SQL을 실행하지 않고 파일만 만들기 때문에, 실행은 직접 준비한 신뢰할 수 있는 데이터베이스에서 합니다.
현재 글: SQL DDL 내보내기
1. 3개 테이블 모델과 PostgreSQL 18 대상 준비
이 실습은 앞선 두 가이드에서 만든 모델을 그대로 이어서 사용합니다. 대상 데이터베이스가 PostgreSQL 18인지 먼저 확인하세요. Dr.ERD는 모델에 선택된 대상에 맞춰 DDL을 만들기 때문에 대상이 다르면 타입과 제약이 달라집니다.
- 파일 목록에서 first-erd 파일을 열거나, 새 모델을 만들어 대상 데이터베이스에서 PostgreSQL 18을 고릅니다.
- Chrome 또는 Edge에서 작업 폴더를 선택해 .drerd 파일과 내보낸 파일을 저장할 위치를 준비합니다. 계정은 필요하지 않습니다.
- 캔버스에 테이블 3개와 관계 2개가 있는지 확인합니다. 아직 없다면 ERD 만들기 초보자 가이드를 먼저 따라 하세요.
- 내보낼 모델: members, orders, order_items.
- AI 대화는 선택 기능이며 SQL DDL 내보내기에는 필요하지 않습니다. 보낸 메시지에만 현재 ERD 맥락이 전달됩니다.
2. 내보내기 메뉴에서 SQL 고르기
툴바의 내보내기 메뉴에서 SQL을 고르면 내보내기 창이 열리고 SQL 미리보기에 만들어진 DDL이 표시됩니다. 파일 이름과 저장 위치는 내보내기를 누른 뒤 열리는 브라우저 저장 창에서 직접 고릅니다.
- 내보내기 메뉴에서 SQL을 고릅니다. 항목 이름은 SQL, 확장자는 .sql입니다.
- 내보내기 창의 SQL 미리보기에서 CREATE TABLE 문과 ALTER TABLE 문을 확인합니다.
- 코멘트 포함과 외래키 포함은 기본값인 켜짐 상태로 둡니다. 외래키 포함을 끄면 외래 키가 사라질 뿐 검증 오류가 해결되지 않습니다.
- 내보내기를 누르고 브라우저 저장 창에서 파일 이름(모델 이름.sql)과 저장 위치를 정해 저장합니다.
- Dr.ERD는 SQL을 실행하지 않습니다. 만든 DDL을 파일로 저장할 뿐입니다.
- 미리보기 글자는 화면에서 선택해 복사할 수 있습니다.
- 범위에서 선택한 테이블만 내보낼 수도 있고, 참조 부모 포함을 함께 켜면 참조하는 부모 테이블까지 포함됩니다.
3. 내보내기 전에 확인할 것
DDL은 모델에 설정된 값을 그대로 출력합니다. 내보내기 전에 컬럼의 NULL 허용, 기본 키, 관계 대응을 확인하세요. 값이 빠져 있으면 Dr.ERD는 DDL을 만들지 않고 오류로 알려 줍니다.
- 세 테이블의 컬럼 10개 모두 NULL 허용이 꺼져 있는지 확인합니다. 꺼 둔 컬럼만 NOT NULL로 출력됩니다.
- 기본 키 3개(members.id, orders.id, order_items.id)가 지정되어 있는지 확인합니다.
- 관계 2개의 참조 키와 FK 대응(members.id → orders.member_id, orders.id → order_items.order_id)이 설정되어 있는지 확인합니다. Mermaid 가져오기로 만든 관계에는 FK 표시만 있고 대응이 비어 있어 직접 설정해야 합니다.
- 이번 실습에는 자동 증가(Identity) 컬럼이 없습니다. id 값은 INSERT할 때 직접 넣습니다.
- 관계가 미설정이면 관계의 참조 키와 FK 대응을 설정하세요 오류가 납니다.
- 부모 컬럼이 기본 키나 UNIQUE가 아니면 참조 키 대응이 유효하지 않아 내보낼 수 없습니다.
- N:M 관계는 중간 테이블을 자동으로 만들지 않으므로 DDL 출력 전에 직접 중간 테이블로 나누세요.
4. 만들어진 DDL 읽는 방법
PostgreSQL 18 출력은 테이블을 만드는 CREATE TABLE 문과 외래 키를 붙이는 ALTER TABLE 문으로 나뉩니다. Dr.ERD는 테이블을 먼저 만들고 관계를 따로 붙이므로, 위에서 아래로 실행하면 외래 키가 참조할 테이블이 이미 존재합니다.
- CREATE TABLE 문에서 컬럼 이름, 타입, NOT NULL, PRIMARY KEY를 확인합니다.
- ALTER TABLE 문에서 FOREIGN KEY (자식 컬럼) REFERENCES 부모 테이블 (부모 컬럼)을 확인합니다.
- 제약 이름이 내 모델의 관계 UUID에서 만들어졌는지 확인합니다.
- 제약 이름은 fk_ 뒤에 관계 UUID 앞부분을 붙여 만듭니다. 관계마다 UUID가 다르므로 내 모델의 이름은 예시와 달라도 정상입니다.
- ON DELETE NO ACTION ON UPDATE NO ACTION은 부모 행을 지우거나 바꿀 때 자식 행이 남아 있으면 데이터베이스가 거부한다는 뜻입니다.
- 이번 실습의 두 관계는 비식별이라 외래 키가 자식 테이블의 기본 키에 들어가지 않습니다.
- 외래 키 컬럼의 타입은 참조하는 컬럼과 같아야 합니다. 다르면 내보내기 전에 타입이 비어 있거나 지원하지 않는다는 오류로 안내합니다.
5. 예시 DDL(PostgreSQL 18 출력)
아래는 이번 3개 테이블 모델을 PostgreSQL 18로 내보냈을 때의 결과입니다. 제약 이름은 관계 UUID에서 만들어지므로 내 모델에서는 fk_ 뒤의 값이 다르고, 테이블·컬럼·타입·참조 관계는 같습니다.
- 문장 순서: CREATE TABLE 3개 → ALTER TABLE 외래 키 2개.
- NULL 허용을 끈 컬럼 10개가 모두 NOT NULL로 출력됩니다.
- 내 모델의 제약 이름이 예시와 달라도 참조 대상과 참조 동작이 같으면 같은 구조입니다.
CREATE TABLE "members" (
"id" BIGINT NOT NULL,
"name" VARCHAR(100) NOT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE "orders" (
"id" BIGINT NOT NULL,
"member_id" BIGINT NOT NULL,
"created_at" TIMESTAMP NOT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE "order_items" (
"id" BIGINT NOT NULL,
"order_id" BIGINT NOT NULL,
"product_name" VARCHAR(100) NOT NULL,
"quantity" INTEGER NOT NULL,
"unit_price" NUMERIC(12,2) NOT NULL,
PRIMARY KEY ("id")
);
ALTER TABLE "orders" ADD CONSTRAINT "fk_11111111222243338444" FOREIGN KEY ("member_id") REFERENCES "members" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE "order_items" ADD CONSTRAINT "fk_66666666777748888999" FOREIGN KEY ("order_id") REFERENCES "orders" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
6. MySQL 8.4와 Oracle 19c에서는 무엇이 다른가요
Dr.ERD는 모델에서 선택한 대상에 맞춰 SQL을 만듭니다. 같은 모델이라도 대상이 다르면 타입과 문법이 달라지므로, PostgreSQL 18 예시를 MySQL이나 Oracle에 그대로 실행할 수 없습니다. 대상별 차이는 다음과 같습니다.
- MySQL 8.4(InnoDB)를 대상으로 새 모델을 만들면 데이터 사전의 금액 도메인이 DECIMAL(18,2)을 제안합니다. MySQL에서 NUMERIC은 DECIMAL의 동의어입니다.
- MySQL의 TIMESTAMP는 1970년부터 2038년까지로 범위가 좁아, 일시 도메인은 DATETIME을 제안합니다.
- Oracle 19c는 BIGINT 대신 NUMBER(19,0), VARCHAR 대신 VARCHAR2(100 BYTE)처럼 바이트 길이를 쓰고, BOOLEAN 타입이 없어 여부 도메인은 제안되지 않습니다.
- MySQL 출력은 식별자를 백틱(`)으로 감싸고 CREATE TABLE 끝에 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4를 붙이며, 자동 증가 컬럼은 AUTO_INCREMENT로 출력됩니다.
- Oracle 출력은 식별자를 큰따옴표로 감쌉니다. Oracle에는 ON UPDATE 동작이 없어 외래 키에 ON UPDATE 절이 출력되지 않습니다.
- 출력된 DDL은 표시된 대상에서만 그대로 실행하세요. 다른 데이터베이스로 옮길 때는 타입을 다시 확인해야 합니다.
7. 저장한 DDL을 데이터베이스에서 확인하기
Dr.ERD는 SQL을 실행하지 않으므로 저장한 파일을 직접 실행해야 합니다. 이때 이미 쓰고 있는 테스트 데이터베이스나 트랜잭션 하나를 사용하면 실수로 남는 테이블을 만들지 않습니다. PostgreSQL 설치와 접속 방법은 이 가이드의 범위가 아닙니다.
- 임시 테스트 데이터베이스에서 실행하거나, 트랜잭션으로 감싸 확인한 뒤 되돌립니다. PostgreSQL에서는 BEGIN; 과 ROLLBACK; 사이에서 확인할 수 있습니다.
- 테이블 3개(members, orders, order_items)와 외래 키 2개가 만들어졌는지 확인합니다.
- 자식 행을 부모 없이 넣어 봅니다. INSERT INTO orders (id, member_id, created_at) VALUES (1, 999, NOW()); 는 외래 키 검증에 걸려 거부되어야 합니다.
- 확인을 마치면 ROLLBACK으로 되돌리거나 임시 데이터베이스를 정리합니다.
- 기대 결과: CREATE TABLE 3개, ALTER TABLE 2개, 외래 키 2개.
- id는 자동 증가가 아니므로 1, 2, 3처럼 직접 값을 넣습니다.
- 부모 행이 없는데 자식 행이 들어간다면 외래 키가 적용되지 않은 것이므로 DDL이 대상 데이터베이스에 맞는지 확인합니다.
8. 자주 겪는 문제 해결
내보내기와 실행 단계에서 자주 만나는 다섯 가지 상황과 확인 방법입니다.
- 기본 키 없음: 부모 테이블에 기본 키가 없으면 참조 키 대응을 설정할 수 없습니다. members.id, orders.id, order_items.id에 PK 지정을 눌러 기본 키로 만든 뒤 관계를 다시 확인하세요.
- 관계 대응 미설정: Mermaid 가져오기로 만든 관계에는 FK 표시만 있고 키 대응이 없습니다. 관계 편집에서 참조 키와 FK 대응을 설정하세요.
- 외래 키 타입 불일치: 참조하는 컬럼과 외래 키 컬럼의 타입·길이·소수가 같아야 합니다. members.id가 BIGINT이면 orders.member_id도 BIGINT입니다.
- N:M 관계: 중간 테이블을 자동으로 만들지 않습니다. 중간 테이블을 직접 만들어 1:N 관계 두 개로 나눈 뒤 내보내세요.
- 폴더 쓰기 권한: 저장 창이 열리지 않거나 저장이 실패하면 작업 폴더 접근 권한을 다시 허용하거나, 쓰기 가능한 다른 폴더를 선택하세요.
9. 다음 단계
모델과 DDL을 함께 관리하면 리뷰와 배포가 쉬워집니다.
- 수정이 생기면 .drerd 파일을 저장하고 SQL DDL을 다시 내보내 같은 내용을 유지합니다.
- 문서와 리뷰에는 Mermaid ERD, 표 형태 자료에는 Excel 내보내기를 함께 사용하세요.