mysql - 如何使用 mysql 防止在 VARCHAR 列中使用数字?

标签 mysql

我有一个名为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/

相关文章:

mysql - Docker ufw 连接到主机

mysql - SQL 查询(如果可能)

mysql - 使用 Laravel 构建器同时为子查询、过滤器、计数创建查询

php - 从 MySQL 数据库中选择表单中的默认值

mysql - 无法从 delpi Xe5 TSqlConnection 连接到 Mysql 数据库

php - 自然连接不返回行

通过 Powershell SSH (POSH) 进行 MYSQLDUMP

php - 保存数据库存储或保存访问多个表的查询?

mysql - 关系数据库中的多个多对多连接: Many tables with Foreign Keys or a single tabel without

php - 开发一个网站所需的所有组件?