【问题标题】:SQLServer choosing primary key typeSQLServer 选择主键类型
【发布时间】:2011-09-17 09:01:51
【问题描述】:

我有一个对象列表,每个对象都有自己的 id,我需要在数据库中为它们创建一个表。使用它们的 id(因为它们是唯一的)作为表中的主键是个好主意,但有一个问题。除了一个对象之外,所有 id 都是整数 - 它有 2 个子对象,id 为 142.1142.2,因此 id 列表为 140, 141, 142.1, 142.2, 143... 现在,如果我选择双精度作为主键类型,那么它将存储不必要的 6 个字节(因为双精度是 8 个字节,INT 是 2)只支持两个双精度数字,我不能选择 INT。那么如果我不能更改对象列表,我应该使用什么类型呢?

【问题讨论】:

  • 不是一个好主意。您永远不应该将逻辑放入主键中。您应该将有关子对象的信息放在单独的列中。
  • int 是 4 个字节而不是 2。(smallint 虽然是 2)
  • 我知道,但我现在不能改变任何东西,我需要用我所拥有的来解决这个问题。
  • 马丁,我看了这张表w3schools.com/sql/sql_datatypes.asp
  • @Sergey,它说该网站上有 4 个字节。您可能查看了 Access 数据类型。 SQL Server 数据类型几乎位于页面底部。

标签: sql-server primary-key sqldatatypes


【解决方案1】:

double 的数学运算是 imprecise,您不应该将它用于离散数字,例如货币或对象 ID。考虑改用decimal(p,s)。其中p 是总位数,s 是点后面的位数。例如,decimal(5,2) 可以存储123.45,但不能存储123412.345

另一个选项是两个整数的复合主键n1, n2

alter table YourTable add constraint PK_YourTable primary key (n1, n2)

【讨论】:

    【解决方案2】:

    int 是四个字节,而不是两个,因此与 double 的大小差异并没有那么大。

    但是,您绝对不应该使用浮点数作为键,因为浮点数不会存储为精确值,而是作为近似值。

    您可以使用带有一个小数位的decimal,例如decimal(5,1),来存储这样的值。 decimal 是一个定点数,因此它存储为精确值,而不是近似值。

    【讨论】:

      【解决方案3】:

      选择适当长度的VARCHAR,并带有CHECK 约束,以确保数据符合您的域规则,例如根据您发布的小样本数据:

      CREATE TABLE Ids 
      (
       id VARCHAR(5) NOT NULL UNIQUE
          CONSTRAINT id__pattern
             CHECK (
                    id LIKE '[0-9][0-9][0-9]'
                    OR id LIKE '[0-9][0-9][0-9].[1-9]'
                   )
      );
      

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 2011-06-08
        • 2013-05-23
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多