[DB] auto increment 수동 insert 와 작동 방식(postgresql ,mysql)

Coodori·2023년 8월 7일
0

Study

목록 보기
6/10
post-custom-banner

궁금증

@Id 설정과 @GeneratedValue를 작성하다보니

auto_increment에 대해서 더 자세하게 알고 싶어져서 작성하게 되었다.

확인을 하다가 mysql 과 postgresql 작동 방법이 다르다는 것을 알게 되었고

추가적으로 auto_increment를비슷하게 스키마를 작성하는 법에 대해 공부를 하였다.

Mysql의 auto_increment

사용법(생성, 수정, 재할당)

CREATE TABLE 테이블이름 (
  컬럼1 INT AUTO_INCREMENT PRIMARY KEY,
  컬럼2 STRING,
    ...
); //생성

ALTER TABLE 테이블명 MODIFY 컬럼명 INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; // 기본키 + auto_increment

ALTER TABLE 테이블명 AUTO_INCREMENT = 숫자; // 수정


ALTER TABLE 테이블명 AUTO_INCREMENT = 1;
SET @ COUNT = 0;
UPDATE 테이블명 SET 컬럼명(AUTO_INCREMENT 설정한 컬럼) = @COUNT := @COUNT + 1;

// 수정 + 숫자 재할당

으로 사용이 가능하다.(Mysql 기준)

AUTO_INCREMENT column 속성에 특정한 값을 지정해 놓지 않는다면, MySQL 이 자동적으로 sequence number 를 할당합니다.
NO_AUTO_VALUE_ON_ZERO SQL mode 가 켜져있지 않는한, 당신은 해당 column 을 0으로 명시할 수 있습니다.
당신이 'AUTO_INCREMENT' column 에 다른 값을 넣을때, 해당 컬럼의 sequence number 는 자동적으로 해당 column 의 최대값로 수정된다.

실습은 https://marlboroyw.tistory.com/454를 참고했다.

고로 결론은 update를 하던 insert로 해서 auto_increment 에 걸려있는 값에 영향을 끼치면 가장 최댓값으로 수정된다.

Postgresql의 auto_increment

auto_increment가 없다.
대신하는 자료형인 serial 이 존재한다.

성공적으로 만들어졌다.

성공했다.

그럼 auto_increment 처럼 최대값으로 갱신이 되는지 보자

에러가 나면서 한번 더 실행해주어야 정상적인 2가 나온다.

그 이후로는 순서대로 생성이 된다.

어떻게 된 일 일까?

serial 은 독립된 sequence 개체를 이용하는 방법이다.
간단하고, 테이블 삭제 때 신경 쓸 부분이 적습니다.
id 값을 강제로 입력하여 저장도 가능합니다.

이로 인해 id 필드 값에 중복값이 발생될수 있습니다.

우리가 생성한 serial의 sequence 객체는 어떻게 볼까?

$ select * from INFORMATION_SCHEMA.SEQUENCES;

이다.

그렇다면 지금 fruits_id_seq 로 id 시퀀스 값이 자동 등록된 것 을 볼 수 있다.


추가
현재 12까지 입력 되어있는 상황이다.

현재의 시퀀스 값을 보고 싶으면

$ SELECT last_value FROM fruits_id_seq;

or

$ SELECT CURRVAL('fruits_id_seq'); 

아래는 현재 세션에만 존재하는 임시값이므로 한번 NEXTVAL 조회 후 사용이 가능하다.

다음 값을 확인할려면

$ SELECT NEXTVAL('fruits_id_seq');

인데 해당 명령어를 사용하면 다음 값을 확인하는 것 뿐만아니라 다음 값으로 넘어간다.

15가 들어간다.


이어서...

그럼 우리는 다음 하고 싶은 값으로 설정 해주면 된다.

다시 정상적으로 6번이 들어갔다.

그렇다면 update 에서는...?

도 최대값이 아닌 해당 Serial 값이 유지가 된다.

Serial과 비슷한 auto_increment 스키마 작성법 여러개!

  1. 가장 기본적인 방법인 시퀀스를 직접 정의

  2. generated always

해당 방법은 자동 생성해주는 값만 넣어줘야하고 직접 할당은 못한다.

  1. generated by default as id

serial 과 동일하게 사용가능(id 직접 insert) 하고 default 를 작성하여 입력 가능

물론 기본키를 넣었으니 serial과 동일하게 유니크하지 않으면 에러를 보여준다.

업로드중..

결론

이렇게 두개의 DB의 자동 증가하는 값을 살펴보았다.

두 개 모두 자동으로 증가는 하지만

  • mysql 은 최댓값으로 만들어준다.
  • postgresql 은 serial 이라는 자료형을 사용한다.

오늘도 백엔드의 세계에 대해서 한가지 알아 간다....

번외로 JPA에서는 identity 는 아래서 보여준 Postgresql의 3번이고 mysql 역시 사용이 가능하다.

Reference

https://dbknowledge.tistory.com/114
https://stackoverflow.com/questions/10114779/how-to-set-up-manually-the-next-value-of-auto-increment
https://aspdotnet.tistory.com/2401
https://kimvampa.tistory.com/146
https://allonsyit.tistory.com/26

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640
post-custom-banner

0개의 댓글