【问题标题】:Regex for MsSQL check constraintMsSQL 检查约束的正则表达式
【发布时间】:2017-01-21 16:52:05
【问题描述】:

我正在尝试对我拥有的表进行列级检查约束。我希望检查插入到列中的值并确保它们只是字符。

例如values ('hello','there') 会通过,但values ('h3llo','th3r3') 不会。

我可以让它适用于特定数量的字符(见下表),但我想让它动态化。

我也尝试过^[a-zA-Z]+$,但这似乎也不起作用。

简单的表格布局如下。

CREATE TABLE owner
  (
     owner_id        ID IDENTITY(1, 1) PRIMARY KEY,
     owner_firstname FIRSTNAME,
     owner_lastname  LASTNAME,
     CONSTRAINT firstname_cc CHECK (owner_firstname LIKE '[a-zA-Z][a-zA-Z][a-zA-Z]'),
     CONSTRAINT lastname_cc CHECK (owner_lastname LIKE '[a-zA-Z][a-zA-Z][a-zA-Z]')
  ); 

【问题讨论】:

    标签: sql-server constraints


    【解决方案1】:

    SQL Server LIKE 语法不接受正则表达式。

    您可以使用check (owner_firstname not like '%[^A-Z]%')

    此约束拒绝任何包含不在A-Z 范围内的字符的值。

    您不需要同时指定 a-z,除非您使用区分大小写的排序规则。

    【讨论】:

    • 尝试此操作并尝试将以下插入插入所有者值('TEST','LOL');我仍然收到以下错误 Msg 547, Level 16, State 0, Line 1 INSERT 语句与 CHECK 约束“firstname_cc”冲突。冲突发生在数据库“alcromer”、表“dbo.owner”、列“owner_firstname”中。该语句已终止。
    • @RoflWaffle17 - 该声明工作正常rextester.com/NFYXQ38880
    • 它似乎对我不起作用.....我从上面的链接中复制并粘贴了您的代码。我也在运行以下版本,Microsoft SQL Server 2012 (SP3-GDR) (KB3194721) - 11.0.6248.0 (X64) Sep 23 2016 15:49:43 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.2 (Build 9200: ) (Hypervisor)
    • @RoflWaffle17 - 你的数据类型是char吗?如果是这样,您将需要 RTRIM 它或更改模式以允许空格。
    • @RoflWaffle17 - 见上面的评论。 char 将自动填充尾随空格,您的问题状态应该被禁止。虽然最好更改为 varchar - 名称不是固定长度的。
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多