AYSTORY
ORACLE과 SQL Server에서의 차이 본문
UPDATE A SET VAL = 200 WHERE ID = '001';
CREATE TABLE B ( ID CHAR(3) PRIMARY KEY );
ROLLBACK;
ORACLE
- DDL은 트랜잭션 경계입니다.
- CREATE TABLE 실행 직전/직후 자동 COMMIT이 발생합니다.
- 결과
- UPDATE는 DDL 직전에 자동 커밋되어 확정.
- CREATE TABLE B도 바로 커밋되어 테이블 B가 생성된 채 유지.
- 뒤의 ROLLBACK은 되돌릴 것이 없어 효과 없음.
최종 상태: A의 값 변경 반영됨, B 존재.
SQL Server (기본 설정: AUTOCOMMIT 모드)
- 각 문장이 각자 트랜잭션으로 실행되어 끝날 때마다 자동 커밋됩니다.
- 결과
- UPDATE는 실행 즉시 커밋.
- CREATE TABLE B도 실행 즉시 커밋.
- ROLLBACK은 열린 트랜잭션이 없어 보통 에러(BEGIN TRAN 없음) 또는 무효.
최종 상태: A의 값 변경 반영됨, B 존재.
SQL Server (참고: 트랜잭션을 명시한 경우)
아래처럼 했을 때만 SQL Server에선 DDL도 롤백 가능합니다.
BEGIN TRAN;
UPDATE A SET VAL = 200 WHERE ID = '001';
CREATE TABLE B ( ID CHAR(3) PRIMARY KEY );
ROLLBACK; -- 두 작업 모두 취소됨, B도 사라짐
또는 SET IMPLICIT_TRANSACTIONS ON 상태에서도 동일하게 롤백됩니다.
한 줄 요약
- Oracle: DDL이 자동 커밋을 일으켜 앞선 DML과 DDL 모두 확정 → ROLLBACK 소용 없음.
- SQL Server(기본): 각 문장이 즉시 커밋 → 결과적으로 Oracle과 동일한 최종 상태.
- SQL Server(명시 트랜잭션): BEGIN TRAN … ROLLBACK으로 DDL까지 되돌릴 수 있음(Oracle은 불가).
Oracle vs SQL Server에서 빈 문자열('') INSERT 시 동작 차이
1) 빈 문자열('')의 해석
- Oracle
- '' → NULL로 변환됩니다. (VARCHAR2, NVARCHAR2, CLOB 등 문자형 전반)
- 그래서 NOT NULL 컬럼에 ''를 넣으면 ORA-01400 (NULL 불가) 오류.
- SQL Server
- ''는 진짜 빈 문자열 그대로 저장됩니다.
- NOT NULL이어도 ''는 허용 (NULL이 아니기 때문).
2) UNIQUE 제약과의 상호작용
- Oracle
- '' → NULL이므로 UNIQUE 컬럼에 여러 번 넣어도 가능(Oracle은 UNIQUE에서 여러 NULL 허용).
- SQL Server
- ''는 값이므로 같은 컬럼에 두 번 넣으면 중복으로 UNIQUE 위반.
- (참고: SQL Server의 UNIQUE는 NULL을 1개만 허용)
3) DEFAULT 값과의 관계
- Oracle
- 기본적으로 컬럼을 생략할 때만 DEFAULT 적용.
- ''를 넣으면 → NULL로 변환 → DEFAULT는 적용 안 됨(명시적 NULL이라서).
- 다만 DEFAULT ON NULL(12c+)을 쓴 컬럼이면, '' → NULL에도 DEFAULT 적용.
- SQL Server
- 컬럼을 생략하거나 DEFAULT 키워드를 쓸 때만 DEFAULT 적용.
- ''를 넣으면 DEFAULT 미적용(이미 값이 있으므로).
4) 문자열 연산/비교에서의 자잘한 차이(보너스)
- 문자열 연결
- Oracle: 'A' || NULL = 'A' (NULL을 빈 문자열처럼 취급)
- SQL Server: 'A' + NULL = NULL (기본 설정),
SET CONCAT_NULL_YIELDS_NULL OFF면 'A' + NULL = 'A'
- NOT NULL 컬럼 채우기 요령
- Oracle: '' 금지 → 최소 한 글자 넣거나 공백 ' '(스페이스)처럼 실제 문자를 넣어야 함
- SQL Server: '' 가능
정리 한 줄
- Oracle: ''는 NULL로 취급 → NOT NULL 불가, UNIQUE에 여러 번 가능, DEFAULT ON NULL이면 기본값 적용 가능.
- SQL Server: ''는 빈 문자열 값 → NOT NULL OK, UNIQUE는 중복 위반, 기본값 미적용.
값이 NULL일 때 다른 값을 대신 반환하도록 도와주는 함수
- SQL Server: ISNULL(expr, val) → NULL이면 val 반환
- Oracle: NVL(expr, val)
- 표준 SQL: COALESCE(expr1, expr2, …)
'SQLD' 카테고리의 다른 글
| LEFT OUTER JOIN의 조건절 활용 예시: 고객번호 필터링 (0) | 2025.08.19 |
|---|---|
| USING 쓸 때 ALIAS 사용 (0) | 2025.08.19 |
| Part2 - Ch3. 관리 구문 (7) | 2025.08.04 |
| Part2 - Ch2. SQL 활용 (2) | 2025.07.29 |
| Part2 - Ch1. SQL 기본 (4) | 2025.07.28 |
