2009-08-30 83 views
1

我有一个已设置为允许Null的字段,但我现在想要将其更改为不允许Null。MySQL从零空间变为非空

当我试图改变这个我不能,因为PhpMyAdmin已经将所有以前的记录设置为空。

我该如何解决这个问题?

是否有一个查询,我可以把这将删除所有的空值,并将字段设置为非空?

回答

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

+0

+1; NULL不仅仅是一个特殊值的懒惰占位符,它表明缺少一个值,并且在设计良好的数据库中,这具有一定的意义。 – Rob 2009-08-30 14:25:16

+0

+1,用于提示42作为占位符值。并理解'null'。 – Eric 2009-08-30 14:27:46

0
UPDATE my_precious_table 
SET stinky_field TO my_favourite_non_null_value 
WHERE stinky_field IS NULL; 
2

你似乎有点困惑,至于什么是空的真的。以下是我在其他地方发布的文章,应该可以安全地在此重新发布:

Null表示没有预定义的值。

当在数据库中的表中创建列时,可以添加一些约束条件。其中一个限制是否更高,列允许空值。

如果行中的某个字段未明确设置为其他字段,则该字段为空。您可以在创建表时提供​​默认值,也可以在向表中添加新行时设置值,或稍后更新行。要添加或更新表中的行,使用INSERT和UPDATE命令。

当一个字段为空时,所有与该字段的比较也将为空。这意味着,当一个空值所涉及的所有布尔代数行为不端: *真正的和空是空 *假和空是空

等等...

普通数学不工作,要么因为5 +空等于空。

这样做的一个有趣的副作用是,当您比较两个都为空的字段时,结果将不为真,它将为空。

要仍然能够处理可以包含空值的字段,有几个选项:T-SQL(Microsoft SQL Server)和MySql都具有函数COALESCE()和ISNULL()。

ISNULL():如果您正在查找的值为空,则返回预定义的值。SELECT ISNULL(NULL,2)将返回2

COALESCE():返回在预定义的列表不为空的第一值:SELECT COALESCE(A,B,C,d ...)

在MySql还有一个空安全比较运算符:a < => b如果两个值均为空,则返回1(true),如果任一值为null,则返回0(false)。

当涉及到表中的计算行你也需要知道空的含义。 SELECT COUNT(*)FROM TableName将返回表中的总行数,但SELECT COUNT(FieldName)FROM TableName将仅返回列'FieldName'不为null的行数。

常常数据库设计,通过lazyness或多或少,设置所有列的默认值在表或限制所有精密组件不允许空。当数据库设计者确实使用数据库的每个人都被迫构成'魔术'值时,就没有实际的价值可供使用。

假设我们有一个表,用于存储车辆信息和在该表中,我们有一个列来存储每个存储的车辆的燃料类型。什么样的燃料应该用于自行车?如果该列允许为空,则答案很简单;由于自行车上没有发动机,因此无需使用燃料类型,因此只需在所有代表自行车的行上将字段设置为空。如果数据库设计人员将禁忌置于不允许null的列上,则开发人员必须设置一个值来表示“无燃料类型”。如果该字段是一个整数零可能会用来做到这一点。此外,如果有一个表格包含车辆表应该参考的所有可行的燃料类型,以查找燃料类型的名称和描述,则开发人员必须在表格中放置假燃料类型,以便数据库管理服务器可以执行数据数据库的完整性。

空是该地段的“普通”的编程语言不具有数据库的一个很不错的功能,但一个数据库开发人员,设计人员需要跟踪在何处以及如何使用它的。

+0

我诚实地通读了一遍,虽然我可以证实这是真的,但哪一段的目的是回答“问题是否存在......”部分? – Zed 2009-08-30 15:09:39

+0

FWIW,还有一个SQL-99谓词'IS [NOT] DISTINCT FROM'工作方式类似于MySQL的专有''<=>操作。 PostgreSQL,IBM DB2和Firebird支持'IS [NOT] DISTINCT FROM'。 – 2009-08-30 15:41:02

+0

实际上没有,但问题要求一种方法来删除空值,并且我得到了他根本不会问的感觉,如果他掌握了null是什么。 – idstam 2009-08-30 20:56:11