Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将NOTNULL约束添加到列_Mysql_Sql_Phpmyadmin - Fatal编程技术网

Mysql 将NOTNULL约束添加到列

Mysql 将NOTNULL约束添加到列,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我正在使用PHPMyAdmin,并尝试将NOTNULL约束添加到表的一列中 PHPMyAdmin接受我的以下查询: ALTER TABLE `wall` MODIFY `token_message` varchar(40) NOT NULL; 但是我仍然可以插入空字符串=NULL,我不明白为什么 PS:如果你要给我一些其他的查询来添加这个约束,请注意,我已经尝试了这3个在我的PHPMyAdmin中不起作用的错误类型:1064-你的SQL语法有一个错误;检查手册: ALTER TABLE `wa

我正在使用PHPMyAdmin,并尝试将NOTNULL约束添加到表的一列中

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; 

您写道,我仍然可以插入空字符串=NULL,这听起来像是误解。在SQL中,空字符串的计算结果不会为NULL,反之亦然。尝试插入一个空字符串,并在token_消息为空的位置执行“从墙中选择”。您应该返回零行。然后尝试执行一个insert,其中指定NULL unquoted作为列的值,应该会得到预期的错误消息


如果这些测试按预期工作,那么一切正常,而您的问题实际上是希望防止插入空白字符串。在查询之前,检查建议,或者在验证期间检查空白字符串

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

ALTER TABLE wall MODIFY token_message varchar(40) NOT NULL default ''
唯一允许的“设置”版本是更改默认值


参考:

我认为这是一个删除输入的问题。正如octern提到的,空字符串在sql中不是空值。处理此问题的最佳方法是仅允许通过删除空字符串(甚至空格字符)的存储过程进行更新:

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

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

INSERT INTO [TBL] (MyVarChar)
VALUES @MyVarChar
这会将任意数量的空格截断为空字符串,将空字符串转换为NULL,然后它将不允许根据您已有的约束插入NULL值。

尝试使用此查询


定义在我的PHPMyAdmin中不工作。可能该列中已经有空值,在这种情况下,DB不会允许您添加该约束,至少在不首先将这些空值设置为非空值的情况下是这样。是否尝试创建新列并复制数据?我已经验证过,我还没有在该列中添加空值。当我尝试其他3个查询时出现的错误是:1064-您的SQL中有一个错误syntax@M我对此进行了测试,当我将一个带有NULL值的varchar列更改为NOT NULL时,它添加了约束,没有问题。空值已自动更改为空字符串,并带有关于截断数据的警告。正确的测试是token_消息为空。您不能将空值与=。谢谢。我假设=将给出一个不太严格的比较,以解释任何意外的类型转换,但这完全不是它在SQL中的工作方式,考虑到整个三元逻辑的重要性,我现在应该知道它是如何工作的。我已经编辑了我的答案。这是真的,并且与OP在第一个问题不起作用后尝试的备选查询相关。但它不能解释他们最初的问题,因为他们尝试的第一个查询是完全合法的,并且接受它没有默认值,但这是可选的。这个问题是用MySQL标记的,而不是SQL Server。
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