Подтвердить что ты не робот

Первичный ключ всегда должен быть неподписанным?

поскольку первичный ключ (идентификатор) не будет находиться под 0, я думаю, он всегда должен быть без знака?

4b9b3361

Ответ 1

MySQL поддерживает необязательный тип данных SERIAL (предположительно для совместимости с PostgreSQL, поскольку 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 

Вы получаете одинаковое количество различных значений, объявляете ли вы целое число с подписью или без знака: 2 32 для INT и 2 64 для BIGINT. Если число без знака, вы получаете значения от 0 до этого максимального значения минус единица. Если число подписано, вы получаете значения от -max/2 до max/2-1. В любом случае вы получаете одинаковое абсолютное количество различных значений.

Но так как AUTO_INCREMENT начинается с нуля по умолчанию и увеличивается в положительном направлении, удобнее использовать положительные значения, чем отрицательные.

Но вряд ли важно, чтобы вы получили в 2 раза больше положительных значений. Любая таблица, которая превысила бы максимальное значащее целое значение 2 31 -1, вероятно, продолжит расти, поэтому вы должны просто использовать BIGINT для этих таблиц.

На самом деле, действительно, вряд ли можно выделить более 2 63 -1 значений первичного ключа, даже если вы удалите все свои строки и повторно загрузите их много раз в день.

Ответ 2

Почему именно вы предполагаете, что первичный ключ не будет находиться под 0? Это не данность. Я думаю, вы сбиваете с толку столбец идентичности.

В любом случае он не должен вносить заметных различий в любом случае, сопоставьте тип данных с типом данных, которые вы ожидаете в столбце, независимо от того, является ли он первичным или нет.

Ответ 3

НЕТ - первичный ключ не всегда будет беззнаковым, например:

 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

Ответ 4

поскольку первичный ключ (идентификатор) не будет находиться под 0

Я предполагаю из этого утверждения, что ваш первичный ключ также автоматически увеличивается.

Если это так, то очень разумно, чтобы ваш столбец был неподписанным, по причине, описанной в Руководство по MySQL:

Столбец AUTO_INCREMENT работает правильно, только если он содержит только положительные значения. Вставка отрицательного числа рассматривается как вставка очень большого положительного числа. Это делается для того, чтобы избежать проблем с точностью, когда числа "обертываются" с положительного на отрицательный, а также для того, чтобы случайно не получить столбец AUTO_INCREMENT, содержащий 0.

Если вы вставляете отрицательные числа в столбец с автоматическим приращением, то вы, вероятно, неправильно решаете проблему.