SQL入门者求助:如何为User表Password字段添加指定字符约束
为User表的Password字段添加CHECK约束方案
要实现密码仅由字母、数字和下划线组成的校验,不同SQL数据库的CHECK约束写法略有差异,以下是主流数据库的实现方式:
PostgreSQL
使用正则匹配操作符~,约束语句如下:
-- 给已存在的表添加约束 ALTER TABLE "User" ADD CONSTRAINT TABLE_PASSWORD CHECK (password ~ '^[a-zA-Z0-9_]+$'); -- 建表时直接添加约束 CREATE TABLE "User" ( id INT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, CONSTRAINT TABLE_PASSWORD CHECK (password ~ '^[a-zA-Z0-9_]+$') );
说明:^[a-zA-Z0-9_]+$表示密码必须从开头到结尾都由允许的字符组成,+确保密码至少有一个字符(若允许空密码可替换为*)。
MySQL(8.0.16及以上版本)
MySQL 8.0.16开始正式支持CHECK约束生效,使用REGEXP函数:
-- 给已存在的表添加约束 ALTER TABLE `User` ADD CONSTRAINT TABLE_PASSWORD CHECK (password REGEXP '^[a-zA-Z0-9_]+$'); -- 建表时直接添加约束 CREATE TABLE `User` ( id INT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, CONSTRAINT TABLE_PASSWORD CHECK (password REGEXP '^[a-zA-Z0-9_]+$') );
SQL Server
使用PATINDEX函数查找非法字符,若不存在则符合条件:
-- 给已存在的表添加约束 ALTER TABLE [User] ADD CONSTRAINT TABLE_PASSWORD CHECK (PATINDEX('%[^a-zA-Z0-9_]%', password) = 0); -- 建表时直接添加约束 CREATE TABLE [User] ( id INT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, CONSTRAINT TABLE_PASSWORD CHECK (PATINDEX('%[^a-zA-Z0-9_]%', password) = 0) );
说明:%[^a-zA-Z0-9_]%匹配任何不在允许集合里的字符,PATINDEX返回匹配位置,返回0表示无非法字符。
注意:User是SQL保留字,所以在不同数据库中需要用对应符号包裹(PostgreSQL用双引号、MySQL用反引号、SQL Server用方括号),避免语法错误。
内容的提问来源于stack exchange,提问作者Aeroo Kymo
相关产品推荐
相关产品推荐

