【问题标题】:Regular expressions as a part of SQL schema正则表达式作为 SQL 模式的一部分
【发布时间】:2012-05-17 09:19:19
【问题描述】:

假设我有一个关系数据库,除其他外,我想在其中存储员工姓名及其标识字符串。标识字符串的格式是严格定义的:它是三个大写字母字符,后跟一个破折号,后跟一个四位数字。

问题:任何关系数据库是否允许定义特定文本字段必须符合的正则表达式?就像在我的示例中一样,最好让数据库根据简单的正则表达式检查员工 ID 的所有值,而不是在 UI 级别进行。

另一个问题:如果我遇到这样的问题(即必须针对一组额外的约束验证字段值),这是否意味着我的架构已非规范化并且我应该修复它?

【问题讨论】:

    标签: sql regex database schema


    【解决方案1】:

    关于你的第二个问题,这取决于。 (当然视情况而定。它总是视情况而定。)如果您总是将员工标识字符串用作单个“整体”值,那么它就是标准化的。如果你发现你不断地将它们分解成“第一和第二”部分(3 个字符,4 个数字),那么你就是在打破第一个范式。 (粗略地说,您在一列中有两个事实,应该将它们分成各自的列。)

    假设进行了适当的规范化,在我看来,您必须依靠数据库来确保数据格式正确这一事实引发了对数据源完整性的质疑。为什么数据在传递到数据库之前没有被检查、清理和放入正确的格式? RDBMS 非常擅长存储、排序和检索数据,但它们在处理复杂算法方面并不那么热门。这不是他们的目的。您可以在数据库中执行此操作,是的,但有更好的方法来执行此操作。

    【讨论】:

      【解决方案2】:

      您可以通过字段上的约束进行检查。这取决于您使用的数据库。在 SQL Server 中,您可能必须使用如下语法:

      check (len(EmpId) = 7 and left(EmpId, 3) between 'AAA' and 'ZZZ' and
             substring(EmpId, 4) = '-' and isnumeric(right(EmpId, 4)) = 1 
      

      首先,检查约束进入表创建,前面是“CONSTRAINT 语句。

      其次,正则表达式将是一种更简洁的方法。但是,并非所有数据库都支持它们。

      第三,上述内容并不完美。例如,它允许前三个字符使用“B1B”。更复杂的逻辑可以解决这个问题。

      最后,为了保证大写,您可能需要将排序规则设置为区分大小写。

      【讨论】:

        【解决方案3】:

        是的,您可以使用检查约束来执行此操作。

        显然,对此的支持因供应商而异。有些数据库对正则表达式的支持有限或不支持,有些不支持检查约束。

        【讨论】:

          猜你喜欢
          • 2018-11-10
          • 2013-11-16
          • 1970-01-01
          • 2018-02-07
          • 1970-01-01
          • 2018-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多