programing

기본 키는 항상 서명되지 않아야 합니까?

javaba 2022. 10. 7. 23:28
반응형

기본 키는 항상 서명되지 않아야 합니까?

프라이머리 키(식별자)는 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.INT2는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

반응형