2015-09-10 27 views
0

這是我在SQL 2012SQL檢查身份證號碼使用LIKE子句

CREATE TABLE Guest(
id INTEGER, 
fname CHAR(10), 
lname CHAR(15) NOT NULL, 
NIC VARCHAR(10) CHECK(NIC LIKE '[0-9]''[0-9]''[0-9]''[0-9]''[0-9]''[0-9]''[0-9]''[0-9]''[0-9]''V'), 
guestaddress VARCHAR(50), 
room_no INTEGER CHECK(room_no BETWEEN 300 AND 700), 
CONSTRAINT pk_Guest PRIMARY KEY (id), 
CONSTRAINT fk_Guest FOREIGN KEY (room_no) REFERENCES Room (room_no) 
) 

創建表的代碼和我想插入以下記錄表

INSERT INTO Guest VALUES(213,'Alex','King','908249792V','No 20,Park Road,Colombo 06',300) 

shows an error,with the NIC number 。我該如何解決這個問題?

(NIC國民身份證號碼包含9位數字,像 123456789V一個V)

+0

你的錯誤是什麼? – inetphantom

+0

INSERT語句與CHECK約束「CK__Guest__NIC__32E0915F」衝突。衝突發生在數據庫「dbSeasideHS」,表「dbo.Guest」,列'NIC'中。 該聲明已被終止。 – laish129

回答

1

你也可以用正則表達式替代類似的查詢,查詢會更具可讀性(如果你知道正則表達式):https://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html

爲您的鏈接正則表達式將

^[0-9]{9}V$ 
| | | || 
| | | |The $ specifies it must be right before the end of the string 
| | | Your V at the end. Case sensitive. 
| | The number the pattern before must be there. 
| a range pattern for all numbers from 0 to 9 
The^specifies it must be right after the start of the string. 

Sam already answered your question.

的其他方面可能是你BETWEEN聲明。是否包括300? 700包括在內?更好地使用room_no > 299 AND room_no < 700

+0

正則表達式確實更具可讀性,我們所在的這個宇宙是什麼? ;) –

+0

@SamPeacey正則表達式檢查http://regexr.com/幫了我很多 – inetphantom

+0

我更指出正則表達式通常不可讀,句號。雖然我很欣賞提示 - 正則表達式不是我的強項! –

2

你的檢查約束是每個數字之間檢查撇號,這應該工作:

CREATE TABLE Guest(
id INTEGER, 
fname CHAR(10), 
lname CHAR(15) NOT NULL, 
NIC VARCHAR(10) CHECK(NIC LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]V'), 
guestaddress VARCHAR(50), 
room_no INTEGER CHECK(room_no BETWEEN 300 AND 700), 
CONSTRAINT pk_Guest PRIMARY KEY (id), 
CONSTRAINT fk_Guest FOREIGN KEY (room_no) REFERENCES Room (room_no) 
)