【问题标题】:Which SQL datatype can be used to store mobile numbers in numeric forms, without including characters like brackets and hyphens?哪种 SQL 数据类型可用于以数字形式存储手机号码,而不包括括号和连字符等字符?
【发布时间】:2019-04-06 21:36:48
【问题描述】:
CREATE TABLE Shopper
(
    Shopperid INTEGER PRIMARY KEY,
    ShopperName VARCHAR2(20) NOT NULL,
    Gender VARCHAR2(6) CHECK(Gender IN ('Male', 'Female')),
    MobileNo NUMBER NOT NULL,
    Address VARCHAR2(50)
);

我正在尝试创建一张桌子,我想要我的手机号码。没有任何连字符和括号。

【问题讨论】:

  • 一个数字不起作用,如果你有一个前导零怎么办? (国际数字)
  • 尝试使用VARCHAR2(10)CHAR(10)
  • 不为空?那就麻烦了。
  • CHECK(Gender IN ('Male', 'Female')) - 不是很热情或包容。此外,什么样的购物应用程序甚至需要知道其客户的性别?鉴于此任务似乎来自训练应用程序,数据模型背后的假设令人担忧。

标签: sql oracle data-modeling


【解决方案1】:

将值存储为带有检查约束的字符串:

CREATE TABLE Shopper (
    Shopperid INTEGER PRIMARY KEY,
    ShopperName VARCHAR2(20) NOT NULL,
    Gender VARCHAR2(6) CHECK (Gender IN ('Male', 'Female')),
    MobileNo VARCHAR2(30) NOT NULL CHECK (REGEXP_LIKE(MobileNo, '^[0-9]*$')),
    Address VARCHAR2(50)
);

【讨论】:

  • 为什么尺寸是 30 tho?
  • @samg - 10 可能还不够; E.164 的用户号码最多为 12 位数字,并且可以在其上加上前导零。在某些情况下——尽管不是在这里——你可能允许完整的 E.164 或扩展等。所以这里 30 可能过多但它并没有真正伤害。如果 OP 可以限制到特定的长度,那么当然可以。
  • @AlexPoole:根据Wikipedia,最大长度为15
  • 我提到了订阅者号码,which is max 12,就像最短的元素可能使 10 不足。完整的 E.164 需要更多,但我们不知道需要什么。如果条目仅限于某些国家/地区的数字,那么较小的限制仍然可以,我没有考虑过。但是 10 个可能还不够; 15 应该是;或 16 如果需要 +(戈登的检查不允许 - 但只是注意到只允许单个数字 *8-)。
【解决方案2】:

这是 Jazir Ahammed 在问题中发布的代码

CREATE TABLE Shopper
(
    Shopperid INTEGER PRIMARY KEY,
    ShopperName VARCHAR2(20) NOT NULL,
    Gender VARCHAR2(6) CHECK(Gender IN ('Male', 'Female')),
    MobileNo NUMBER NOT NULL,
    Address VARCHAR2(50)
);

这是戈登·林诺夫的帖子

CREATE TABLE Shopper (
    Shopperid INTEGER PRIMARY KEY,
    ShopperName VARCHAR2(20) NOT NULL,
    Gender VARCHAR2(6) CHECK (Gender IN ('Male', 'Female')),
    MobileNo VARCHAR2(30) NOT NULL CHECK (REGEXP_LIKE(MobileNo, '^[0-9]$')),
    Address VARCHAR2(50)
);

这是 INFYTQ 在 DBMS 上的协作任务 2 的答案

CREATE TABLE Shopper(
Shopperid INTEGER,
ShopperName VARCHAR2(20) NOT NULL,
Gender CHAR(6),
MobileNo NUMBER NOT NULL,
Address VARCHAR2(50),
CONSTRAINT  s_id_pk PRIMARY KEY(ShopperId),
CONSTRAINT s_gender_ck CHECK(Gender IN ('Male', 'Female'))
)

image of output at InfyTQ

【讨论】:

  • 这到底是怎么回答这个问题的???这个“答案”基本上是问题的副本,没有格式化和重新排列一些约束条款!!!
  • 请仔细查看 3 个代码:1)作为问题发布的代码,2)在我的帖子之前回答的代码 3)和我已回答的代码。如果您仍然难以找出它们之间的差异,请告诉我,以便我可以帮助您。-@GMc
  • 从另一个站点发布一些代码——即使你承认出处——也不构成一个体面的答案。如果您认为您的答案比 Gordon 的建议更好并且实际上解决了 OP 遇到的问题,您应该解释原因。
  • 当然,很高兴为您解释。并感谢所有将我的答案标记为无用的人,这是一种激励。现在让我解释一下,当我用 CHAR 替换 VARCHAR2 时,我的代码在 InfyTQ 上运行良好,因为这是他们为 GENDER 设置的约束。另一个需要注意的区别是,我为表设置了表级约束,而@GMc 具有首选列级约束。对于可用于以数字形式存储手机号码的 SQL 数据类型,不包括括号和连字符等字符 - 与 VARCHAR2 相比,NUMBER 数据类型将是最合适的数据类型。 -@APC
  • 让我提醒一下,我发布的这段代码不是来自任何其他网站的代码。我相信这是一个不错的答案,因为我已经花时间检查为什么我的代码不能工作,直到我想出这段代码作为结论。最后令我惊讶的是它确实有效。已附上截图以供参考。 -@APC
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2011-03-06
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多