@Id
설정과 @GeneratedValue
를 작성하다보니
auto_increment에 대해서 더 자세하게 알고 싶어져서 작성하게 되었다.
확인을 하다가 mysql 과 postgresql 작동 방법이 다르다는 것을 알게 되었고
추가적으로 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 에 걸려있는 값에 영향을 끼치면 가장 최댓값으로 수정된다.
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 값이 유지가 된다.
가장 기본적인 방법인 시퀀스를 직접 정의
generated always
해당 방법은 자동 생성해주는 값만 넣어줘야하고 직접 할당은 못한다.
serial 과 동일하게 사용가능(id 직접 insert) 하고 default 를 작성하여 입력 가능
물론 기본키를 넣었으니 serial
과 동일하게 유니크하지 않으면 에러를 보여준다.
이렇게 두개의 DB의 자동 증가하는 값을 살펴보았다.
두 개 모두 자동으로 증가는 하지만
오늘도 백엔드의 세계에 대해서 한가지 알아 간다....
번외로 JPA에서는
identity
는 아래서 보여준 Postgresql의 3번이고 mysql 역시 사용이 가능하다.
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