我有一个字段已经设置为允许为Null,但现在我想将其更改为不允许为Null。
每当我尝试更改它时,我都无法更改,因为PhpMyAdmin已经将以前的所有记录都设置为Null。
我如何解决这个问题?
有没有可以删除所有Null值并将字段设置为Non Null的查询?
发布于 2009-08-30 14:21:49
当然了。但是您所说的“删除所有NULL值”是什么意思?这是否意味着删除该字段中具有NULL的所有行?如果是这样,您可以这样做:
DELETE FROM your_table WHERE your_field IS NULL;如果您想保留这些行,则必须在该字段中放入其他值。有没有说得通的?如果是这样,您可以这样做:
UPDATE your_table SET your_field = 42 WHERE your_field IS NULL;(当然,42是您想要使用的任何值。)
如果您想保留这些行,并且没有其他可以使用的值,那么现在应该保留现有的NULL,并且可能需要重新评估为什么要将该字段设置为NOT NULL。
发布于 2009-08-30 14:30:44
你似乎对null的真实含义有些困惑。这是我在其他地方发表的一篇文章,在这里转载应该是安全的:
Null表示没有预定义的值。
在数据库的表中创建列时,可以添加一些约束。其中一个约束是该列是否允许空值。
如果行上的字段没有显式设置为其他值,则它将为null。您可以在创建表时提供默认值,也可以在向表中添加新行时设置一个值,或者在以后更新该行。要在表中添加或更新行,可以使用INSERT和update命令。
当字段为null时,与该字段的所有比较也将为null。这意味着当涉及空值时,所有布尔代数都会发生错误:* True和null为Null * False和Null为Null
如…等
普通数学也不起作用,因为5+ Null等于Null。
这样做的一个有趣的副作用是,当您比较两个都为空的字段时,结果将不为真,它将为空。
为了仍然能够处理可以包含空值的字段,有两个选项: T-SQL (Microsoft SQL Server)和MySql都有COALESCE()和ISNULL()函数。
ISNULL():如果要查找的值为空,则返回一个预定义的值。SELECT ISNULL(null,2)将返回2
COALESCE():返回预定义列表中不为null的第一个值: SELECT COALESCE(a,b,c,d ...)
在MySql中还有一个null安全比较运算符:a,<=>,b,如果两个值都为空,则返回1(真),如果任一个值为空,则返回0(假)。
在计算表中的行数时,您还需要注意null的含义。SELECT COUNT(*) FROM TableName将返回表中的总行数,但SELECT COUNT(FieldName) FROM TableName将仅返回列'FieldName‘不为null的行数。
通常,数据库设计人员或多或少会因懒惰而为表中的所有列设置默认值,或者将所有字段限制为不允许为null。当数据库设计人员这样做时,当没有实际的值可用时,每个使用数据库的人都会被迫编造“魔术”值。
假设我们有一个用于存储车辆信息的表,并且在该表中我们有一个列来存储每个存储的车辆的燃料类型。自行车应该使用什么类型的燃料?如果列允许null,答案很简单;因为自行车上没有引擎,所以没有燃料类型可用,所以只需在表示自行车的所有行上将该字段设置为null即可。如果数据库设计者在不允许null的列上设置了约束,则开发人员必须编造一个值来表示“无燃料类型”。如果该字段是一个整数,则可以使用零来执行此操作。此外,如果存在包含车辆表应该引用的所有可行燃料类型以查找燃料类型的名称和描述的表,则开发人员必须在表中放置假燃料类型,以便数据库管理服务器可以强制数据库的数据完整性。
Null是数据库的一个非常好的特性,这是许多“普通”编程语言所没有的,但数据库开发人员和设计人员需要跟踪它的使用位置和方式。
发布于 2009-08-30 14:22:18
UPDATE my_precious_table
SET stinky_field TO my_favourite_non_null_value
WHERE stinky_field IS NULL;https://stackoverflow.com/questions/1353970
复制相似问题