아래와 같이 입력을 했을 때,
ERROR: (beverage_id)=(1) 키가 "beverages" 테이블에 없습니다."order_details" 테이블에서 자료 추가, 갱신 작업이 "order_details_beverage_id_fkey" 참조키(foreign key) 제약 조건을 위배했습니다
오류: "order_details" 테이블에서 자료 추가, 갱신 작업이 "order_details_beverage_id_fkey" 참조키(foreign key) 제약 조건을 위배했습니다
SQL state: 23503
Detail: (beverage_id)=(1) 키가 "beverages" 테이블에 없습니다.
이러한 오류 메세지가 화면에 뜨는데 해결 방법을 못 찾겠습니다 ㅠㅠ
CREATE TABLE orders (
id SERIAL PRIMARY KEY, -- PK
status VARCHAR(50), -- 주문 상태
created_at TIMESTAMPTZ -- 주문시각
);
CREATE TABLE beverages (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
price INTEGER,
btype VARCHAR(50)
);
CREATE TABLE order_details (
id SERIAL PRIMARY KEY, -- PK
order_id INTEGER REFERENCES orders(id), -- 결재액
beverage_id INTEGER REFERENCES beverages(id), -- 결제 종류
count INTEGER
);
INSERT INTO
orders(status, created_at)
VALUES
('DELIVERED', '2022-02-26 8:32:13'),
('CANCELLED', '2022-02-26 8:35:27'),
('DELIVERED', '2022-02-26 8:44:53'),
('DELIVERED', '2022-02-26 9:05:12'),
('DELIVERED', '2022-02-26 9:11:35'),
('DELIVERED', '2022-02-26 9:14:18'),
('DELIVERED', '2022-02-26 9:34:20'),
('DELIVERED', '2022-02-26 9:44:27'),
('DELIVERED', '2022-02-26 9:48:25'),
('DELIVERED', '2022-02-26 11:14:52'),
('CANCELLED', '2022-02-26 11:32:13'),
('DELIVERED', '2022-02-26 11:55:40'),
('DELIVERED', '2022-02-26 12:15:01'),
('DELIVERED', '2022-02-26 12:21:52'),
('CANCELLED', '2022-02-26 12:29:17')
;
INSERT INTO
order_details(order_id, beverage_id, count)
VALUES
(1, 1, 1),
(2, 1, 2),
(2, 2, 3),
(3, 8, 2),
(3, 1, 2),
(4, 8, 1),
(5, 4, 1),
(6, 5, 3),
(7, 1, 3),
(7, 2, 2),
(8, 1, 1),
(9, 5, 1),
(10, 1, 4),
(11, 2, 1),
(12, 3, 1),
(13, 1, 6),
(14, 1, 8),
(14, 2, 2),
(14, 2, 2),
(15, 1, 4)
;
INSERT INTO
beverages(name, price, btype)
VALUES
('아메리카노', 4500, 'COFFEE'),
('라떼', 5000, 'COFFEE'),
('카푸치노', 5000, 'COFFEE'),
('카페모카', 5500, 'COFFEE'),
('콜드브루', 5200, 'COFFEE'),
('레몬 에이드', 3800, 'AID'),
('자몽 에이드', 4800, 'AID'),
('바닐라 쉐이크', 5800, 'SHAKE')
;
sehongpark님의 답변
해당 오류 메시지는
`order_details` 테이블에
데이터를 추가하거나 갱신할 때
`beverage_id` 필드의
제약 조건을 위반했음을 나타냅니다.
구체적으로,
`order_details` 테이블의 `beverage_id` 열이
`beverages` 테이블의 `id` 열을 참조하는 외래키로 설정되어 있는데,
`order_details`에 삽입하려는 `beverage_id` 값이
`beverages` 테이블에 존재하지 않습니다.
이 문제를 해결하기 위해서는 두 가지 방법이 있습니다:
① `beverages` 테이블에
해당 `beverage_id`를 갖는 데이터를
먼저 추가합니다.
이 경우 `beverage_id`가 1인 음료 데이터가
`beverages` 테이블에 없기 때문에,
이를 추가해야 합니다.
② `order_details` 테이블에 삽입하려는 `beverage_id` 값을
`beverages` 테이블에 이미 존재하는
유효한 `id` 값으로 변경합니다.
제시된 SQL 스크립트를 보면,
`beverages` 테이블에 데이터를 삽입하는 부분이
`order_details` 테이블에 데이터를 삽입하는 부분보다 뒤에 위치해 있습니다.
이는 `order_details` 테이블에 데이터를 삽입할 때
`beverages` 테이블에 해당 `beverage_id`가 아직 존재하지 않는다는 것을 의미합니다.
따라서,
`beverages` 테이블에 데이터를 삽입하는 SQL 명령을
`order_details` 테이블에 데이터를 삽입하는 명령보다
앞으로 이동시켜야 합니다.
수정된 SQL 스크립트의 순서는 다음과 같아야 합니다:
1. `orders` 테이블 생성
2. `beverages` 테이블 생성
3. `order_details` 테이블 생성
4. `beverages` 테이블에 데이터 삽입
5. `orders` 테이블에 데이터 삽입
6. `order_details` 테이블에 데이터 삽입
이 순서대로 SQL 스크립트를 실행하면
오류 없이 데이터를 삽입할 수 있습니다.