【问题标题】:Limit record inserted into mysql to be exact 9 numbers将插入 mysql 的记录限制为准确的 9 个数字
【发布时间】:2020-08-04 10:10:48
【问题描述】:

我的数据库中有一个电话号码字段,我想让它只接受准确的 9 个数字

Mysql版本:5.7.31

【问题讨论】:

  • 如何将其保存为 varchar(9) 并在您的应用上验证仅允许使用数字?
  • 我想在数据库上验证它。

标签: mysql database mariadb


【解决方案1】:

根据CHECK Constraint添加。

作为列约束:

CREATE TABLE my_table (
    ...
    phone_number INT 
                 NOT NULL 
                 CHECK (phone_number BETWEEN 100000000 AND 999999999),
    ... );

或作为表约束:

CREATE TABLE my_table (
    ...
    phone_number INT 
                 NOT NULL,
    CONSTRAINT phone_9_digits 
        CHECK (phone_number BETWEEN 100000000 AND 999999999),
    ... );

约束只处理一列 - 所以列约束类型是首选。


如何对现有表执行此操作?

更改列定义或表定义。例如,

ALTER TABLE my_table
CHANGE COLUMN phone_number 
              phone_number INT 
                           NOT NULL 
                           CHECK (phone_number BETWEEN 100000000 AND 999999999);

如果您使用不支持 CHECK 约束的旧 MySQL 版本,请使用触发器包。

CREATE TRIGGER tr_bi_check_phone_for_9digits
BEFORE INSERT -- and the same for BEFORE UPDATE
ON my_table
FOR EACH ROW
BEGIN
    IF NEW.phone_number NOT BETWEEN 100000000 AND 999999999 THEN                        
        SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Phone Number must have 9 digits strictly.';
    END IF;
END

如果phone_number 存储为字符串,则检查条件phone_number BETWEEN 100000000 AND 999999999 可以替换为,例如

phone_number REGEXP '[0-9]{9}'

这也将允许您存储从零开始的电话号码。

【讨论】:

  • 如何对现有表执行此操作?
  • @mohammadhayajneh 根据 ALTER TABLE 添加约束。
  • 请您也可以在 alter table 上添加示例。
  • CHANGE COLUMN mobile mobile INT NOT NULL CHECK (mobile BETWEEN 100000000 AND 999999999); [Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 5 行的“CHECK (mobile BETWEEN 100000000 AND 999999999)”附近使用正确的语法
  • @mohammadhayajneh 也许你的 MySQL 版本太旧了?您还没有指定它...如果您的版本不支持 CHECK 约束,则使用 BEFORE INSERT 和 BEFORE UPDATE 触发器进行相应的检查,如果检查失败,则使用 SIGNAL。
【解决方案2】:

首先,我不想在数据库中实现这个逻辑。它可能会发生变化(并非每个国家/地区都有相同的电话号码布局,即使在一个国家/地区内,有时电话号码格式也会发生变化)。您可能想要强加某种格式(例如,将区号与数字分开)。使用数据库错误作为沟通格式问题的一种方式通常不是很好 - 用户界面需要理解该逻辑,而且它不是特别容易管理。

但如果你真的想在数据库中做,你可以创建一个trigger来验证输入,然后再将其写入表,否则会抛出错误。

【讨论】:

    【解决方案3】:

    您是否曾经填写过表格,却因为没有使用 期望的邮政编码、电话、信用卡号的确切间距、破折号、括号等而被它吐槽?

    为了用户着想,我强烈建议您允许任何通常允许的间距等。然后删除多余的东西。如果出现任何问题,请从 UI 中向用户吐口水,而不是数据库。数据库中的数据应该由 UI 清理。

    国际电话号码前面的+1(或任何国家/地区代码)怎么样?还是您的应用是单一国家/地区的应用,并且会一直如此?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多