0

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

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

我昨天发了一篇文章(RegEx 的 MySQL Queriable Field Constraint),引用了我读过的东西,但对 MySQL 来说看起来并不乐观,所以我将它开放给任何数据库引擎,尽管我更喜欢 MS SQL、Oracle、DB2或 MySQL,因为它会更容易出售业务。

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

4

2 回答 2

3

在 Oracle 中,您可以指定自定义约束,您可以在其中使用评估regexp的函数;例如:

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'
于 2016-02-02T15:50:12.997 回答
0

这是 sql server 中的通配符示例。

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')
于 2016-02-02T15:52:57.787 回答