将NOT NULL约束添加到列中。
将NOT NULL约束添加到列中。
我正在使用PHPMyAdmin,并尝试将NOT NULL约束添加到我的表的列中。
PHPMyAdmin接受以下查询:
ALTER TABLE `wall` MODIFY `token_message` varchar(40) NOT NULL;
但是我仍然可以插入空字符串(=NULL),我不明白为什么。
附注:如果您要给我提供其他查询来添加此约束,请注意我已经尝试过这些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;
在MySQL中,添加NOT NULL约束到列的问题可能是由于未正确处理空字符串而导致的。在MySQL中,空字符串''不被视为NULL值。要解决这个问题,可以通过存储过程来处理更新操作,将空字符串和空格字符去除:
CREATE PROCEDURE InsertIntoMyDb (IN MyVarChar VARCHAR(2000)) BEGIN DECLARE trimmedVarChar VARCHAR(2000); SET trimmedVarChar = NULLIF(RTRIM(LTRIM(MyVarChar)), ''); INSERT INTO `TBL` (MyVarChar) VALUES (trimmedVarChar); END
这样,存储过程将会将任意数量的空格字符截断为一个空字符串,并将空字符串转换为NULL。然后,基于已经设置的约束,将不允许插入NULL值。
需要注意的是,该问题标记为MySQL,而不是SQL Server。
问题的原因是作者误解了SQL中空字符串与NULL的区别。解决方法是通过在列上添加NOT NULL约束来防止插入空字符串。以下是整理后的文章:
你写道:“我仍然可以插入空字符串(=NULL)”,这听起来像是一个误解。在SQL中,空字符串与NULL不等价。尝试插入一个空字符串并执行SELECT from wall where token_message is NULL
。你应该得到零行结果。然后尝试插入一个指定为NULL
(不带引号)的值,你应该会得到预期的错误信息。
如果这些测试按预期工作,那么一切都没问题,你的问题实际上是你想要防止插入空字符串。可以在查询之前的验证过程中检查空字符串,或者参考这个问题获取建议。
正确的测试是WHERE token_message IS NULL
。你不能使用=
来比较NULL。
谢谢。我之前假设=
会进行一种不太严格的比较,考虑到任何意外的类型转换,但在SQL中完全不是这样工作的(考虑到三值逻辑的重要性,我现在应该知道了)。我已经编辑了我的回答。
在MySQL中,如果要向一个列添加NOT NULL约束,需要完全重新指定该列的定义。无法仅仅更改列的某个属性,必须完全重新定义该列。唯一允许的“SET”版本是更改默认值。根据官方文档(http://dev.mysql.com/doc/refman/5.1/en/alter-table.html)所述,可以使用以下语法来添加NOT NULL约束:
ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL DEFAULT 默认值
然而,这个问题只能解释为什么在第一个查询中没有指定默认值时被接受,但无法解释他们最初的问题。因为第一个查询是完全合法并被接受的(虽然没有默认值,但这是可选的)。