PostgreSQL列上的字符串格式约束不起作用

时间:2016-02-24 15:54:39

标签: postgresql format check-constraint

我正在将数据库从SQL Server移动到PostgreSQL,并在其中一个表中遇到检查约束的一些问题。 PostgreSQL版本是9.5.1。

我有一个表,我在其中一个列上创建了一个检查约束来强制执行格式。这在SQL Server中有效。我们的想法是,只有以字母AF开头并后跟三个数字字符(例如AF001)的值才能输入其中一列。

SQL看起来像这样创建表:

CREATE TABLE TableName (
referenceID     VARCHAR(5) NOT NULL CHECK (referenceID LIKE 'AF[0-9][0-9][0-9]'),
comment         VARCHAR(50) NOT NULL,
PRIMARY KEY (referenceID)   
);

但是当我尝试输入任何数据时,它会失败。数据输入示例:

INSERT INTO TableName (reference, comment) VALUES ('AF000','A comment');

我得到的错误是:

ERROR:  new row for relation "tablename" violates check constraint "tablename_referenceID_check"
DETAIL:  Failing row contains (AF000, A comment).

********** Error **********

ERROR: new row for relation "TableName" violates check constraint "tablename_referenceID_check"
SQL state: 23514
Detail: Failing row contains (AF000, A comment).

我假设问题与实际检查约束有关,但我不确定。

1 个答案:

答案 0 :(得分:4)

LIKE子句在PostgreSQL中不使用正则表达式模式。您应该使用LIKE子句代替SIMILAR TO

CREATE TABLE TableName (
referenceID     VARCHAR(5) NOT NULL CHECK (referenceID SIMILAR TO 'AF[0-9]{3}'),
comment         VARCHAR(50) NOT NULL,
PRIMARY KEY (referenceID)   
);