SQLServer选择主键类型

时间:2011-09-17 09:01:51

标签: sql-server primary-key sqldatatypes

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

3 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:1)

int是四个字节,而不是两个字节,因此与double的大小差异不是很大。

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

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

答案 2 :(得分:1)

选择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]'
             )
);