2016-02-24 69 views
1

我正在將數據庫從SQL Server移動到PostgreSQL,並在其中一個表中檢查約束時遇到了一些問題。 PostgreSQL版本是9.5.1。PostgreSQL列上的字符串格式約束不起作用

我有一個表,我創建一個檢查約束列強制執行格式。這在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). 

我假設的問題是與實際的檢查約束,但我不能確定。

回答

2

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) 
);