기본 키는 항상 서명되지 않아야 합니까?
프라이머리 키(식별자)는 0보다 작기 때문에 항상 서명되지 않아야 합니까?
TL/DR: 네, 하지만 거의 문제가 되지 않습니다.
자동 인크리먼트는 항상 증가하므로 음수 값은 사용되지 않습니다.부호 없이 만들면 값의 두 배 범위를 얻을 수 있습니다.
한편 테이블에서 2개의 값을 사용하는 경우31 단시간에 2개의 값도 사용할32 수 있기 때문에 값의 범위를 2배로 하는 것은 큰 차이가 없습니다.어쨌든 BIGINT로 업그레이드해야 합니다.
MySQL은 옵션 지원SERIAL
데이터 타입(Postgre와의 호환성을 위해 상정)SQL, 이후SERIAL
는 표준 ANSI SQL이 아닙니다).이 데이터 타입은, 다음의 정보를 작성하는 단순한 단축형입니다.BIGINT UNSIGNED
.
한 번 해보세요.
CREATE TABLE test.foo (foo_id SERIAL PRIMARY KEY);
SHOW CREATE TABLE test.foo;
CREATE TABLE `test`.`foo` (
`foo_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`foo_id`),
UNIQUE KEY `foo_id` (`foo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
서명된 정수를 선언하든 서명되지 않은 정수를 선언하든 동일한 수의 고유 값을 얻을 수 있습니다32.INT
2는64 a의 경우BIGINT
. 숫자가 부호 없는 경우 0에서 최대값에서 1을 뺀 값을 얻을 수 있습니다.번호가 서명되어 있는 경우는, 다음의 값으로부터 취득됩니다.-max/2
로.max/2-1
어느 쪽이든 동일한 절대 개수의 고유 값을 얻을 수 있습니다.
하지만 그 이후로는AUTO_INCREMENT
기본적으로 0에서 시작하여 양의 방향으로 증가하므로 음의 값보다 양의 값을 사용하는 것이 더 편리합니다.
하지만 긍정적인 값의 2배가 되는 것은 거의 문제가 되지 않습니다.서명된 최대 정수값 2-1을31 초과하는 테이블은 계속 증가할 수 있으므로BIGINT
를 참조해 주세요.
모든 행을 삭제하고 하루에 여러 번 다시 로드하더라도 2-1 이상의63 기본 키 값을 할당할 가능성은 매우 낮습니다.
왜 프라이머리 키가 0보다 작지 않을 거라고 생각하시는 거죠?그건 기정사실이 아니에요.아이덴티티 컬럼과 혼동하고 계신 것 같습니다.
어느 경우든 데이터 유형은 기본 키인지 여부에 관계없이 열에서 예상되는 데이터 유형에 매핑합니다.
프라이머리 키(식별자)가 0보다 작기 때문에
그 진술로 미루어 보면, 당신의 기본 키도 자동으로 증가한다고 가정합니다.
이 경우 MySQL 매뉴얼에 기재되어 있는 이유로 컬럼에 서명이 없는 것을 확인하는 것이 매우 적합합니다.
AUTO_INCREMENT 열은 양의 값만 포함하는 경우에만 올바르게 작동합니다.음수를 삽입하는 것은 매우 큰 양의 숫자를 삽입하는 것으로 간주됩니다.이는 숫자가 양수에서 음수로 "감겨" 있을 때의 정밀도 문제를 방지하고 0이 포함된 AUTO_INCREMENT 열이 실수로 표시되지 않도록 하기 위한 것입니다.
자동 증가 열에 음수를 삽입하는 경우 문제를 잘못 해결하는 것일 수 있습니다.
NO - 기본 키에 항상 서명이 없는 것은 아닙니다. 예를 들어 다음과 같습니다.
create table user_status
(
status_id tinyint not null primary key,
name varchar(64) not null,
msg varchar(255) default null
)engine=innodb;
insert into user_status values
(-99,'banned', 'Account banned'),
(-2,'closed', 'Account closed'),
(-1,'unverified', 'Account not verified'),
(0,'suspended','Account suspended'),
(1,'active', null);
이것이 주문표라면 order_id int unsigned를 사용합니다.
언급URL : https://stackoverflow.com/questions/2686813/primary-key-should-always-be-unsigned
'programing' 카테고리의 다른 글
호출된 메서드에서 발신자의 메서드 이름을 가져오려면 어떻게 해야 합니까? (0) | 2022.10.07 |
---|---|
Java: Array List에서 중복을 검출하시겠습니까? (0) | 2022.10.07 |
__init__py는 무엇을 위한 것입니까? (0) | 2022.10.07 |
쿠키 이름 지정 - 모범 사례 (0) | 2022.10.07 |
문자열 대신 mariadb 10 uncompress() return blob (0) | 2022.10.07 |