我有一张名为user
的表,它将通过user_id和username进行查询。而user_id
类型为int
,username
(具有类型varchar
)不应该只有包含数字。该程序可以帮助检查输入,但我希望通过在数据库级别上不允许纯粹的数字来加倍保护它。如何防止在使用mysql的VARCHAR列中使用数字?
如何做到这一点?
我有一张名为user
的表,它将通过user_id和username进行查询。而user_id
类型为int
,username
(具有类型varchar
)不应该只有包含数字。该程序可以帮助检查输入,但我希望通过在数据库级别上不允许纯粹的数字来加倍保护它。如何防止在使用mysql的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 +需要),以下snipplet工作:
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
声明提出了一个Error Code: 1644. Invalid username containing only digits
而
insert into `test`.`user` values(1, 'a1234');
已正确插入
。
注意:有些荣誉也给想法Throw an error in a MySQL trigger。
请注意,此示例只能防止INSERT
s。如果您想要安全,您还需要在UPDATE
上实施触发器。
对user_id使用整数类型,所以你只能存储数值数据 –
@BerndBuffen我的问题是我不想有数字数据(在varchar中) –