我有一个已设置为允许Null的字段,但我现在想要将其更改为不允许Null。
当我试图改变这个时,我不能,因为PhpMyAdmin已将所有先前的记录设置为Null。
如何解决此问题?
我可以放置一个查询,删除所有Null值并将字段设置为Non Null吗?
答案 0 :(得分:5)
当然。但你是什么意思“删除所有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
。
答案 1 :(得分:2)
你似乎对null真实的东西感到有些困惑。这是我在其他地方发表的一篇文章,应该可以安全地在这里重新发布:
Null表示没有预定义的值。
在数据库的表中创建列时,可以添加一些约束。其中一个约束是否是列允许空值。
如果未明确设置为其他字段,则该行上的字段将为null。您可以在创建表时提供默认值,也可以在向表中添加新行时设置值,或稍后更新行。要在表中添加或更新行,请使用INSERT和UPDATE命令。
当字段为空时,与该字段的所有比较也将为空。这意味着当涉及空值时,所有布尔代数都行为不正常: *真和空是空的 * False AND Null为Null
依旧......
普通数学不起作用,因为5 + Null等于Null。
这个有趣的副作用是,当你比较两个都为空的字段时,结果将不为真,它将为空。
要仍然可以使用包含空值的字段,还有几个选项:T-SQL(Microsoft SQL Server)和MySql都具有COALESCE()和ISNULL()函数。
ISNULL():如果您要查找的值为null,则返回预定义值。 SELECT ISNULL(null,2)将返回2
COALESCE():返回非空的预定义列表中的第一个值:SELECT COALESCE(a,b,c,d ...)
在MySql中还有一个空安全比较运算符:a< => b如果两个值都为空,则返回1(true);如果任一值为null,则返回0(false)。
在计算表中的行时,您还需要了解null的含义。 SELECT COUNT(*)FROM TableName将返回表中的总行数,但SELECT COUNT(FieldName)FROM TableName将仅返回“FieldName”列不为空的行数。
通常,数据库设计者或多或少地通过延迟设置表中所有列的默认值或将所有字段限制为不允许为空。当数据库设计者这样做时,每个使用数据库的人都被迫在没有实际值的情况下构成“魔术”值。
假设我们有一个用于存储车辆信息的表格,在该表格中我们有一列用于存储每个存储车辆的燃料类型。自行车应该使用什么燃料类型?如果列允许null,则答案很容易;由于自行车上没有发动机,因此没有燃料类型可供使用,因此只需在代表自行车的所有行上将该字段设置为空。如果数据库设计者将禁令放在不允许为null的列上,则开发人员必须组成一个值来表示“无燃料类型”。如果该字段是整数,则可以使用该值。此外,如果有一个包含车辆表应该参考的所有可行燃料类型的表,以查找燃料类型的名称和描述,开发人员必须在表中放置假燃料类型,以便数据库管理服务器可以强制执行数据数据库的完整性。
Null是许多“普通”编程语言所没有的数据库的一个非常好的功能,但数据库开发人员和设计人员需要跟踪它的使用位置和方式。
答案 2 :(得分:0)
UPDATE my_precious_table
SET stinky_field TO my_favourite_non_null_value
WHERE stinky_field IS NULL;