2012-04-18 103 views
3

我正在使用PHPMyAdmin,并尝试将NOT NULL约束添加到我的表的列中。将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

定义 “不要在我的phpMyAdmin的工作。”也许你已经在该列中有了'null'值,在这种情况下,数据库不会让你添加该约束(至少不是首先将这些'null'值设置为'null'以外的值)。 – 2012-04-18 21:27:37

+0

您是否尝试过创建新列并将数据复制过来? – Hajo 2012-04-18 21:28:31

+0

我已经验证过,我还没有在该列的空值。当我尝试3个其他查询时出现的错误是:#1064 - 你的SQL语法有错误 – Anon 2012-04-18 21:31:18

回答

5

你写道:“我还可以插入空字符串(= NULL)”,这听起来像一个误解。在SQL中,空字符串不计算为NULL,反之亦然。尝试插入一个空字符串并做SELECT from wall where token_message is NULL。你应该回零行。然后尝试在指定NULL(未加引号)的列中插入值作为列的值,并且您应该得到预期的错误消息。

如果这些测试按预期工作,那么一切都很好,而你的问题实际上是你想防止插入空白字符串。查询this question以获得建议,或者在查询之前检查空白字符串。

+1

正确的测试是'WHERE token_message IS NULL'。你不能与'='比较空值。 – 2012-04-18 21:44:47

+0

谢谢。我认为=会给出一个不太严格的比较,它可以解释任何意外的类型转换,但这完全不是它在SQL中的工作原理(我现在应该知道,考虑到整个三元逻辑的重要性)。我编辑了我的答案。 – octern 2012-04-18 22:10:36

2

MySQL的列alter语法要求您完全重新指定该列。你不能只是更改列的一个属性,你必须完全重新定义它:

ALTER TABLE wall MODIFY token_message varchar(40) NOT NULL default '' 

唯一允许的“SET”版本更改默认值。

裁判:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

+0

这是真的,并且与OP在第一次尝试之后尝试的替代查询无关。但它无法解释他们的原始问题,因为他们尝试的第一个查询是完全合法的并且被接受(它没有默认值,但是这是可选的)。 – octern 2012-04-18 22:12:21

0

我觉得这是你的擦洗投入的问题。正如提到的octern,一个空字符串('')在sql中不是NULL值。处理这种情况最好的办法是只允许通过剥离了空字符串,即使空格字符存储过程的更新:

CREATE PROC InsertIntoMyDb (@MyVarChar VARCHAR(2000)) AS 

SET @MyVarChar = NULLIF(RTRIM(LTRIM(@MyVarChar)), '') 

INSERT INTO [TBL] (MyVarChar) 
VALUES @MyVarChar 

这将截断任意数量的空格为一个空字符串,把一个空字符串转化为NULL,然后它将不允许根据您已有的约束插入NULL值。

+0

这个问题被标记为MySQL,而不是SQL-Server。 – 2012-04-18 22:13:20

+0

糟糕,你是对的。相同的过程,不同的语法。 – 2012-04-18 23:33:50

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