我有一个名为user
的表,它将通过user_id和用户名来查询。虽然 user_id
的类型为 int
,但username
(属于 varchar
类型)不应仅 包含数字。该程序可以帮助检查输入,但我想通过不允许数据库级别上已有的纯数字来双重保护它。
如何实现这一点?
最佳答案
您正在寻找 CHECK
SQL 运算符。不幸的是,任何 MySQL 引擎都不支持这一点。
不过,有一个解决方法,即使用 SQL 触发器。您可以在 CHECK constraint in MySQL is not working 找到更多信息和 http://dev.mysql.com/doc/refman/5.7/en/create-trigger.html
所以,对我来说(需要 MySQL 5.5+),以下代码片段有效:
use test;
CREATE TABLE user (
`user_id` INT NOT NULL,
`username` VARCHAR(50) NULL,
PRIMARY KEY (`id`)
);
delimiter //
create trigger trg_trigger_test_ins before insert on user
for each row
begin
if new.username REGEXP '^[0-9]*$' then
signal sqlstate '45000' set message_text = 'Invalid username containing only digits';
end if;
end
//
delimiter ;
insert into user values(1, '1234');
最后一个 INSERT
语句引发了错误代码:1644。仅包含数字的用户名无效
while
insert into `test`.`user` values(1, 'a1234');
已正确插入。
注意:也对 Throw an error in a MySQL trigger 表示赞赏关于信号
的想法。
请注意,此示例仅防止 INSERT
。如果你想安全,还需要在UPDATE
上实现触发器。
关于mysql - 如何使用 mysql 防止在 VARCHAR 列中使用数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37372749/