是否有允许 RegEx 指定的可查询字段约束的数据库引擎



我正在寻找一个可以处理通过正则表达式指定的数据约束的数据库引擎。因此,除了数据类型之外,我还希望能够控制数据的格式。例如,一个varchar(255)字段可以进一步限制为像[a-zA-Z0-9 ]

我也需要能够查询正则表达式,以便我可以在整个 n 层系统中共享这些约束,以便在多个级别上强制执行。 例如,MySQL允许查询information_schema以获取元数据,其他数据库引擎也有类似的方式。

我昨天写了一篇文章(RegEx的MySQL Queriable Field Constraint),引用了我读过的东西,但MySQL看起来没有希望,所以我向任何数据库引擎开放,尽管我更喜欢MS SQL,Oracle,DB2或MySQL,因为它更容易销售业务。

是否有允许这些正则表达式限制的数据库引擎?如果是这样,它是哪一个以及如何设置和查询约束?

在 Oracle 中,您可以指定自定义约束,在这些约束中,您可以使用评估正则表达式的函数;例如:

SQL> create table test_pattern ( txt varchar2(1000))
  2  /
Table created.
SQL> alter table test_pattern add constraint check_pattern check (regexp_instr(txt, '^START') != 0)
  2  /
Table altered.
SQL> insert into test_pattern values ('START a d f  g ')
  2  /
1 row created.
SQL> insert into test_pattern values ('_START a d f  g ')
  2  /
insert into test_pattern values ('_START a d f  g ')
*
ERROR at line 1:
ORA-02290: check constraint (SIUINTEGRA.CHECK_PATTERN) violated

您可以获取有关使用以下内容设置的约束的信息:

select *
from dba_constraints       
where table_name = 'TEST_PATTERN'

这是 sql 服务器中的一个通配符示例。

create table #Something
(
    SomeValue varchar(255)
    , constraint MyCheck CHECK (SomeValue like '[a-z][a-z][0-9]%')
)
insert #Something
select 'ab3adoofnod'
--(1 row(s) affected)
insert #Something
select 'a3b3adoofnod'
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "MyCheck". The conflict occurred in database "tempdb", table "dbo.#Something__________________________________________________________________________________________________________0000000000DD", column 'SomeValue'.
The statement has been terminated.

如果要使用某些 t-sql 来查看检查约束的定义,可以使用sys.check_constraints目录视图。

下面是查看上表的所有检查约束的示例。定义列将提供约束中定义的通配符搜索。

select * 
from tempdb.sys.check_constraints
where parent_object_id = object_id('tempdb..#Something')

最新更新