我有一張名爲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中) –