2015-05-07 50 views
1

我需要创建一个约束或类似的东西,只允许字符像A-Z,在一列_-拒绝特定的字符

这怎么办?

+0

哪个数据库? –

+0

这是关于MS SQL 2008r2,而不是mySQL! –

+6

您正在使用哪种RDBMS? SQL Server,Oracle,MySQL? –

回答

5

尝试this..It做工精细以毫秒为单位SQL Server的

CREATE TABLE TestTable 
(ID INT, FirstCol VARCHAR(100), 
CONSTRAINT FirstCol CHECK (FirstCol NOT LIKE '%[^a-zA-Z\_-]%' ESCAPE '\')) 
+0

喜欢,而不是喜欢。 (“只允许像AZ,字符_和 - 。”) – jarlh

+2

@jarlh - 这是一个双重否定,因为我们知道的字符,可以让不想要列出所有的字符不允许(注意''^在'[]'里面)。所以'不喜欢'在这里是正确的。 –

+0

对不起,我为时过早......没有注意到^。但为什么不只是“LIKE'%[a-zA-Z \ _-]%'ESCAPE'\'”? – jarlh

0

您可以使用正则表达式的约束,如果他们的支持。

使用的PostgreSQL看起来如下一个例子:

CREATE TABLE user(
    name VARCHAR 
    CONSTRAINT constraint_name CHECK (name ~* '^[A-Z_-]*$') 
); 

注意,该正则表达式允许空字符串和没有小写字符。

否则(在情况下,MySQL的),你可以使用一个插入触发器:

DELIMITER $$ 
CREATE TRIGGER trigger_name BEFORE INSERT ON table_name 
    FOR EACH ROW 
    BEGIN 
     IF (NEW.phone REGEXP '^[A-Z_-]*$') = 0 THEN 
      SIGNAL SQLSTATE '12345' 
      SET MESSAGE_TEXT = 'Invalid content'; 
    END IF; 
END$$ 
DELIMITER ; 

对于MS SQL:

CREATE TABLE table_name(
    name VARCHAR(100) CHECK (name NOT LIKE '%[^A-Z_-]%' 
))