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

问题描述 投票:0回答:8

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

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

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

sql sql-server sql-server-2008 sql-server-2008-r2
8个回答
14
投票

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

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

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

varchar
列中。


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)
    );

另一种选择是使用长度为 10 的 Varchar 字段,那么您应该检查仅输入数字且长度不小于 10。


1
投票

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


1
投票

我建议您使用

varchar
来存储电话号码(仅适用于电话号码,因为电话号码可能包含连字符、加号)并将长度限制为
10
varchar(10)

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

check (phone_number between 0 and 9999999999)

旁注:

如果您使用 int -21474836482147483647

范围之外的数字,您将收到这样的错误消息

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

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


0
投票

我认为没有办法限制你是否使用像 int、bigint、smallint 和tinyint 这样的数字字段

创建一个

varchar(10)
字段并在插入之前进行验证

您仍然需要使用 int 字段来存储电话号码,您需要在应用程序中之前进行限制


0
投票

将列设为 varchar 并创建一个检查,确保其严格应包含 10 个字符

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

0
投票

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

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

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


0
投票

我的建议是:

CREATE TABLE trial_table (phone_number VARCHAR(13));

该栏也可用于国际号码。

© www.soinside.com 2019 - 2024. All rights reserved.