【问题标题】:Should MySQL's primary key be just INTEGER or should it be UNSIGNED INTEGER (of appropriate size)?MySQL 的主键应该只是 INTEGER 还是应该是 UNSIGNED INTEGER(适当大小)?
【发布时间】:2014-10-09 23:42:08
【问题描述】:

假设我正在 MySQL 中创建一个表:

CREATE TABLE animals (
    id INT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (id)
);

主键应该是简单的INT 还是应该设置为UNSIGNED INT?我知道负主键没有多大意义,所以我认为应该是UNSIGNED INT。虽然哪一个会更快?

【问题讨论】:

  • 为什么不呢?如果它是唯一的,那没关系
  • @Leo 我只是在学习。如果您说没关系,那么我将继续使用 UNSIGNED INT。 :)
  • unsigned 会给你更大的范围。性能我不知道,但我想这两个选项都差不多
  • 使用 unsigned 的唯一问题往往发生在您忘记在其他地方使用(或无法使用)时——您可能会被截断或一些奇怪的浮点转换或谁知道。我想,任何选择都是如此——如果你把它放在错误的变量中,事情就会爆炸。
  • @bodacydo 对于name 字段使用Varchar 比使用char 更好。

标签: mysql unsigned signed


【解决方案1】:

您可以完全避免考虑它:

CREATE TABLE animals (
    id SERIAL,
    name CHAR(30) NOT NULL
);

(确实将其创建为无符号整数,并且还添加了唯一索引和自动递增)

【讨论】:

  • SERIAL 是新事物。直到。
  • 刚才我发现SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的别名。
【解决方案2】:

我们对所有代理主键使用INT UNSIGNED 或BIGINT UNSIGNED。我们还为列使用名称 id。

整数 PRIMARY KEY 的负值没有什么问题(或必然是坏事),带符号整数也可以。

使用无符号整数需要注意的一个问题:最大值大于有符号整数的最大值。 (INT UNSIGNED 最大值是 2^32-1,而不是 2^31-1。)任何客户端程序都需要注意这一点;如果值超过 2^31-1,将 INT UNSIGNED 映射到 32 位有符号整数(例如,C int 类型)将是一个问题。

【讨论】:

  • 这往往是 php 的问题。
【解决方案3】:

如果它像通常那样自动递增,则它应该是无符号的,否则您将在溢出点得到意外的排序。

【讨论】:

    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2012-06-08
    相关资源
    最近更新 更多