✨ver1의 설계로 DB, Node.js 코드 구현해보기
Table delivery
Table orders
Table orderedBook
결제하기에서 설계한 API에서 약속된 DB를 생성해줬다. |
🗝️방금 INSERT한 데이터 PK가져오는 방법❗❗
✨LAST_INSERT_ID()
SELECT LAST_INSERT_ID();
장점
- 단일세션에서 안전하다.
- 세션별로 작동하기 때문에 동시성에 문제가 없다.
- 여러 클라이언트가 동시에 레코드를 삽입하더라도 각 클라이언트마다의 id 값을 가지고 온다.
- 복잡한 트랜잭션이나 쿼리없이 삽입한 레코드의 id값을 쉽게 가지고 올 수 있다.
- AUTO_INCREMENT 필드와 호환되므로 DB에서 자동으로 생성되는 값에 유용하다.
- 특히 기본키나 참조무결성을 유지하는 상황에서 많이 사용된다.
- 트랜잭션 내에서 삽입된 값의 id를 트랜잭션이 끝나기전에 안전하게 가져올 수 있다.
- 트랜잭션의 무결성을 유지하는데 도움이 된다.
단점
- 한 번에 여러행을 삽입할경우 첫 번째 삽입된 행의 id만 반환한다.
INSERT INTO table_name (col1, col2) VALUES ('value1', 'value2'), ('value3', 'value4');
SELECT LAST_INSERT_ID(); -- 첫 번째 삽입된 행의 ID만 반환
- 서버 세션 의존성으로 현재 세션에만 적용된다.
- 클라이언트가 중간에 연결이 끊기거나 세션이 변경되면 올바른 id를 가져올 수 없다.
- 웹 어플리케이션처럼 여러 클라이언트가 상호작용하는 시스템에서 큰 문제가 생길 수 있다.
- AUTO_INCREMENT 필드가 없으면 사용할 수 없다.
- MySQL에서 사용하는 함수이므로 다른 데이터베이스에서는 동일한 기능이 없거나 다를 수 있어 이식성이 떨어진다.
✨MAX()
SELECT MAX(id) FROM 테이블명;
장점
- 특정 컬럼에 최댓값을 반환한다.
- 단순히 숫자 필드뿐만 아니라, 날짜, 문자열 등에서도 사용 가능하다.
- id뿐만 아니라 다른 필드에서도 최대값을 구하는 데 적합하다.
단점
- 여러 클라이언트가 동시에 작업을 수행하는 환경에서 얻은 id는 현재 세션에서 삽입된 레코드의 id값이 아닐 가능성이 있다.
- 세션별로 독립적으로 리되어 id를 얻는 것이 아니기 때문에 가장 최근에 삽입된 id가 다른 클라이언트의 id일 가능성이 있다.
- 호출 될때마다 테이블의 모든 행을 스캔하여 가장 큰 값을 찾아야 하기 때문에 성능이 저하될 수 있다.
- 큰 테이블의 경우 쿼리가 느려질 수 있고, 인덱스가 없다면 더 많은 자원을 소모할 수 있다.
- AUTO_INCREMENT와 동기화되지 않을 수 있다.
- 삽입 중 오류가 발생할 경우, auto_increment는 증가하지만 레코드는 삽입되지 않을 수 있다. MAX()는 마지막 성공적인 삽입된 id만을 반환하여 auto_increment값과 차이가 있을 수 있다.
orderController.js
- 주문하기, insertId를 가지고와서 INSERT문을 사용하는 것 까지 구현했다.