将空白单元格更新为NULL会导致所有单元格均为NULL

时间:2019-06-19 14:27:05

标签: mysql

我有一个查询,试图将只有空字符串的单元格更新为NULL。但是,相反,当我运行此命令时,所有单元格最终都为NULL:

UPDATE table_name
SET InvoiceId=NULL,
 LinkedAccountId=NULL,
 RecordId=NULL,
 ProductName=NULL,
 RateId=NULL,
 SubscriptionId=NULL,
 PricingPlanId=NULL,
 UsageType=NULL,
 Operation=NULL,
 AvailabilityZone=NULL,
 ReservedInstance=NULL,
 UsageStartDate=NULL,
 UsageEndDate=NULL,
 UsageQuantity=NULL,
 BlendedRate=NULL,
 UnBlendedRate=NULL,
 ResourceId=NULL,
 Engagement=NULL,
 Name=NULL,
 Owner=NULL,
 Parent=NULL 
WHERE InvoiceId='' 
 OR LinkedAccountId='' 
 OR RecordId='' 
 OR ProductName='' 
 OR RateId='' 
 OR SubscriptionId='' 
 OR PricingPlanId='' 
 OR UsageType='' 
 OR UsageEndDate='' 
 OR Operation='' 
 OR AvailabilityZone='' 
 OR ReservedInstance='' 
 OR UsageStartDate='' 
 OR UsageEndDate='' 
 OR UsageQuantity='' 
 OR BlendedRate='' 
 OR UnBlendedRate='' 
 OR ResourceId='' 
 OR Engagement='' 
 OR Name=''
 OR Owner='' 
 OR Parent='';

我在做什么错了?

3 个答案:

答案 0 :(得分:2)

您正在将所有字段设置为NULL,其中任何字段= ''

您可能需要编写与要更新的字段一样多的查询。

我可能是错的,但是我认为这不可能在单个查询中完成

UPDATE table_name
SET InvoiceId = NULL
WHERE InvoiceId = ''

每个字段都有这个

答案 1 :(得分:2)

解释SQL查询的方法如下:

UPDATE table_name

SET
  (all these fields to null)
WHERE
 (if ANY Of these conditions is true)

我同意Cid的观点,一次在每个查询中执行1个字段可能是最安全的方法,但这是您可以在单个查询中编写此字段的方法:

UPDATE table_name SET
  field1 = IF(field1='',NULL,field1),
  field2 = IF(field2='',NULL,field2),
  /* etc */

答案 2 :(得分:1)

我认为您假设WHERE子句中的术语与SET子句中的分配具有隐式关联,因此将仅设置某些列,具体取决于哪些列满足WHERE子句中的各个术语。这不是SQL的工作方式。

真正发生的是,对WHERE子句的 whole 条件进行了评估,以选择受影响的。然后应用 all SET分配,因此将在满足整个WHERE子句条件的行上更改所有列。

要一次性完成您想做的事情,您可以通过以下方式做到这一点:

UPDATE table_name
SET InvoiceId=NULLIF(InvoiceId, ''),
 LinkedAccountId=NULLIF(LinkedAccountId, ''),
 RecordId=NULLIF(RecordId, ''),
 ProductName=NULLIF(ProductName, ''),
 RateId=NULLIF(RateId, ''),
 SubscriptionId=NULLIF(SubscriptionId, ''),
 PricingPlanId=NULLIF(PricingPlanId, ''),
 UsageType=NULLIF(UsageTYpe, ''),
 Operation=NULLIF(Operation, ''),
 AvailabilityZone=NULLIF(AvailabilityZone, ''),
 ReservedInstance=NULLIF(ReservedInstance, ''),
 UsageStartDate=NULLIF(UsageStartDate, ''),
 UsageEndDate=NULLIF(UsageEndDate, ''),
 UsageQuantity=NULLIF(UsageQuantity, ''),
 BlendedRate=NULLIF(BlendedRate, ''),
 UnBlendedRate=NULLIF(UnBlendedRate, ''),
 ResourceId=NULLIF(ResourceId, ''),
 Engagement=NULLIF(Engagement, ''),
 Name=NULLIF(Name, ''),
 Owner=NULLIF(Owner, ''),
 Parent=NULLIF(Parent, '') 

如果NULLIF() function的两个参数相等,则返回NULL,否则返回第一个参数。因此,如果每列不是 '',则它是空操作,将列设置为其自己的原始值。