我正在使用PHPMyAdmin,我尝试将NOT NULL约束添加到我的表的列中。
PHPMyAdmin接受以下查询:
ALTER TABLE `wall` MODIFY `token_message` varchar(40) NOT NULL;
但我仍然可以插入空字符串(= NULL),我不明白为什么。
PS:如果你要给我一些其他的查询来添加这个约束,请注意我已经尝试过这些3在我的PHPMyAdmin中不起作用(有点错误:#1064 - 你有一个错误您的SQL语法;请查看手册):
ALTER TABLE `wall` ALTER COLUMN `token_message` SET NOT NULL;
ALTER TABLE `wall` ALTER COLUMN `token_message` varchar(40) NOT NULL;
ALTER TABLE `wall` MODIFY `token_message` CONSTRAINTS token_message_not_null NOT NULL;
答案 0 :(得分:5)
你写道,“我仍然可以插入空字符串(= NULL),”这听起来像是一种误解。在SQL中,空字符串不会计算为NULL,反之亦然。尝试插入空字符串并执行SELECT from wall where token_message is NULL
。你应该得到零行。然后尝试执行插入操作,在其中指定NULL
(未引用)作为列的值,您应该得到预期的错误消息。
如果这些测试按预期工作,那么一切都很好,而你的问题实际上是你想要阻止插入空字符串。查看this question以获取建议,或者在查询之前检查验证期间是否有空白字符串。
答案 1 :(得分:2)
MySQL的列alter alter语法要求您完全重新指定列。您不能只更改列的一个属性,您必须完全重新定义它:
ALTER TABLE wall MODIFY token_message varchar(40) NOT NULL default ''
唯一允许的“SET”版本是更改默认值。
答案 2 :(得分:0)
我认为这是擦除你的意见的问题。正如提到的那样,空字符串('')在sql中不是NULL值。处理此问题的最佳方法是仅允许通过存储过程去除空字符串甚至空格字符的更新:
CREATE PROC InsertIntoMyDb (@MyVarChar VARCHAR(2000)) AS
SET @MyVarChar = NULLIF(RTRIM(LTRIM(@MyVarChar)), '')
INSERT INTO [TBL] (MyVarChar)
VALUES @MyVarChar
这会将任意数量的空格截断为空字符串,将空字符串转换为NULL,然后根据您已有的约束不允许插入NULL值。
答案 3 :(得分:0)
尝试使用此查询
Alter table table_name
change column_name column_name datatype(length) definition
即
Alter table wall
change tocken_message tocken_message varchar(40) NOT NULL DEFAULT