3

我正在使用 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; 
4

4 回答 4

6

您写道,“我仍然可以插入空字符串 (=NULL)”,这听起来像是一种误解。在 SQL 中,空字符串不会计算为 NULL,反之亦然。尝试插入一个空字符串并执行SELECT from wall where token_message is NULL. 你应该得到零行。NULL然后尝试在您指定(未引用)作为列值的地方进行插入,您应该会收到预期的错误消息。

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

于 2012-04-18T21:34:55.270 回答
3

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

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

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

参考:http ://dev.mysql.com/doc/refman/5.1/en/alter-table.html

于 2012-04-18T21:42:31.537 回答
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 值。

于 2012-04-18T22:09:13.747 回答
0

尝试使用此查询

Alter table table_name 
change column_name column_name datatype(length) definition

IE,

Alter table wall 
change tocken_message tocken_message varchar(40) NOT NULL DEFAULT
于 2014-01-20T04:40:55.693 回答