在SQL Server中创建表时如何限制INTEGER的长度?

时间:2014-08-21 09:17:38

标签: sql sql-server sql-server-2008 sql-server-2008-r2

在SQL SERVER中创建表时,我想限制INTEGER列的长度只能等于10.

例如:PhoneNumber是一个INTEGER,它必须是一个10位数字。

创建表格时如何执行此操作?

8 个答案:

答案 0 :(得分:6)

如果要限制整数列的范围,可以使用检查约束:

create table some_table
(
   phone_number integer not null check (phone_number between 0 and 9999999999)
);

但是作为R.T.和huMpty duMpty指出:电话号码通常最好存储在varchar列中。

答案 1 :(得分:2)

如果我理解正确,您需要确保条目的长度恰好是10位数。

如果你坚持使用整数数据类型,我会推荐Bigint,因为Int的范围限制(-2 ^ 31(-2,147,483,648)到2 ^ 31-1(2,147,483,647))

CREATE TABLE dbo.Table_Name(
    Phone_Number BIGINT CONSTRAINT TenDigits CHECK (Phone_Number BETWEEN 1000000000 and 9999999999)
    );

另一种选择是让Varchar字段的长度为10,那么你应该只检查输入的数字,长度不小于10。

答案 2 :(得分:1)

按照我的说法,电话号码不应该存储在整数中,因为我们不会对其进行任何数字操作,例如添加分割。我们将把它视为字符串,例如找到ISD的所有数字说'91'或STD'022'等等,如果你切换到使它成为整数你必须处理溢出

答案 3 :(得分:0)

我建议您使用varchar作为电话号码(仅用于电话号码,因为某些电话号码可能包含连字符,phus符号)并将长度限制为10即,varchar(10)

正如注释中a_horse_with_no_name正确指出的那样,您可以将数字约束放在指定范围内,如下所示:

check (phone_number between 0 and 9999999999)

另请注意: -

如果使用int范围之外的数字 - 2147483648 2147483647

,您将收到类似这样的错误消息
  

将表达式转换为数据类型int的算术溢出错误。

因此,在您的情况下,您将无法使用所有长度为10的int。

答案 4 :(得分:0)

如果您使用int, bigint, smallint, and tinyint

等数字字段,我认为没有办法限制

创建varchar(10)字段并在插入

之前进行验证

您仍然需要使用int字段来存储电话号码,您需要在申请之前加以限制

答案 5 :(得分:0)

创建列varchar并创建一个严格应该有10个字符的检查

create table some_table
(
   phone_number varchar(10) check (len(phone_number)=10)
);

答案 6 :(得分:0)

首先考虑内部和外部格式:

是的,电话号码可以存储为整数。但是,您必须确保所有数字都以相同的格式存储,例如作为没有加号的国际号码。例如,4940123456将是德国号码,因为49是德国国家代码。然而,要稍后分析这个数字会很困难;国家/地区代码可以是1到4位数,然后是可能未知数量的区号代码。但只是知道一个数字而不知道它的结构可能就足够了。通过检查限制,您可以确保该数字是正数且不长于,允许的最长数字是多长?请注意:每次显示数字时,您可能必须格式化输出(在给出的示例中:在数字中添加前导加号)。

另一种方法是将电话号码存储为字符串。这样可以存储诸如'+ 49-40-123456'之类的数字。然后内部格式与外部格式相同。优点:每次显示数字时,您都不必考虑格式化输出。但是你甚至可以根据需要更改输出格式(删除破折号或用实际的县拨号代码替换加号或删除本地呼叫的国家和地区代码等)。你必须决定是否强制执行某种格式或不。如果没有,那么数字可能看起来非常不同'123456','004940123456','040/123456',...为了强制执行某种格式,你会写一个函数(因为这种格式的复杂性)并使用它在检查约束中。或者写一个插入触发器(这应该是一个BEFORE INSERT触发器,因为你想要改变一个值;因为T-SQL没有提供这个,你可以使用INSTEAD OF INSERT触发器)来根据需要设置字段格式

答案 7 :(得分:0)

我的建议是:

CREATE TABLE trial_table (phone_number VARCHAR(13));

该列也可以用于国际号码。