поскольку первичный ключ (идентификатор) не будет находиться под 0, я думаю, он всегда должен быть без знака?
Первичный ключ всегда должен быть неподписанным?
Ответ 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.
Если вы вставляете отрицательные числа в столбец с автоматическим приращением, то вы, вероятно, неправильно решаете проблему.