MySQL INSERT INTO Mytable VALUES(NULL)VALERES(' NA');

时间:2014-05-06 18:04:58

标签: mysql

我在Mytable中有一些值='NA' 我想把这个值保留为NULL。 所以我写道:

INSERT INTO Mytable
VALUES(NULL)
WHERE VALUES('NA');

但我没有工作。 我没有列出列的名称,因为可能所有列都可以有一些'NA'值。 我希望有人有这个想法。 问候 萨姆

3 个答案:

答案 0 :(得分:4)

UPDATE Mytable
SET value = NULL
WHERE value = 'NA';

是的,您必须为要更新的每个列/属性执行此操作。

答案 1 :(得分:1)

UPDATE Mytable SET value = NULL WHERE value = 'NA'

答案 2 :(得分:1)

要在多列中替换'NA'NULL的匹配项,对于表中的所有行,您可以在单个更新查询中执行此操作。诀窍是,当您不希望更改值时,将列的当前值分配回列。

例如:

UPDATE Mytable t
   SET t.column_one = IF(t.column_one='NA',NULL,t.column_one)
     , t.column_two = IF(t.column_two='NA',NULL,t.column_two)
     , t.column_fee = IF(t.column_fee='NA',NULL,t.column_fee)
 WHERE t.column_one = 'NA'
    OR t.column_two = 'NA'
    OR t.column_fee = 'NA'

注意:

对需要进行替换的每个列重复列分配。 (上面的示例引用了三列,名为column_onecolumn_twocolumn_fee。我不知道表中列的名称;您需要替换这些列使用表格中列的实际名称。)

WHERE子句是可选的;如果没有WHERE子句,查询将具有相同的净结果。 (如果没有WHERE子句,查询将更新表中的每一行;任何不在三列之一中具有“NA”的行都不会更改,因为将为所有列分配其当前值。

对于很多列,在单个操作中执行它更有效,在一个语句中对一行应用多个更改,而不是对每个列进行更新的单独语句。)

表达式IF(a,b,c)将表达式a计算为布尔值;如果返回TRUE,则返回表达式b,否则返回表达式c


要查看其工作原理,可以运行SELECT语句(删除SET子句,并使用SELECT列表中的SELECT和相关表达式替换UPDATE关键字: 例如:

SELECT t.column_one                            AS _one_old
     , IF(t.column_one='NA',NULL,t.column_one) AS _one_new
     , t.column_two                            AS _two_old
     , IF(t.column_two='NA',NULL,t.column_two) AS _two_new
     , t.column_fee                            AS _fee_old
     , IF(t.column_fee='NA',NULL,t.column_fee) AS _fee_new
  FROM Mytable t
 WHERE t.column_one = 'NA'
    OR t.column_two = 'NA'
    OR t.column_fee = 'NA'

_old列返回列中的现有值; _new列返回将分配的值(通过我的答案中的UPDATE语句。)

当该列中的现有值为IF()时,该查询的结果将验证'NA'表达式将返回NULL;当列中的现有值不是IF()时,它还会确认'NA'表达式将返回现有值。


<强>后续

有20个不同的表,每个表有12列,我会利用MySQL中的information_schema.columns表来帮助我生成所需的表达式。

这样的事情:

SELECT CONCAT('    , t.'
        ,c.column_name,' = IF(t.'
        ,c.column_name,'=''NA'',NULL,t.'
        ,c.column_name,')') AS expr
  FROM information_schema.columns c
 WHERE c.table_schema = 'mydatabase'      -- the name of your database
   AND c.table_name   = 'mytable'         -- the name of your table
   AND c.data_type IN ('varchar','char')  -- only character type columns
 ORDER BY c.ordinal_position

将返回以下内容:

expr
-------------------------------------
    , t.fee = IF(t.fee='NA',NULL,t.fee)
    , t.fi = IF(t.fi='NA',NULL,t.fi)
    , t.fo = IF(t.fo='NA',NULL,t.fo)
    , t.fum = IF(t.fum='NA',NULL,t.fum)

所以,这并没有实际更新表,它只是一种避免输入一堆SQL表达式的方便方法。您可以复制该结果集,并使用它来形成类似于我在上面的答案中显示的语句。 (显然,您会省略您不想更改的行,并且第一个逗号需要更改为SET关键字,并且该语句的其余部分需要包含此内容。

就个人而言,我不会打扰WHERE子句,因为如果它有很多列,那么查询将会对表格进行全面扫描。

SELECT CONCAT(' OR t.',c.column_name,' = ''NA''') AS expr
  FROM information_schema.columns c
 WHERE c.table_schema = 'mydatabase'      -- the name of your database
   AND c.table_name   = 'mytable'         -- the name of your table
   AND c.data_type IN ('varchar','char')  -- only character type columns
 ORDER BY c.ordinal_position

这将返回如下内容:

expr
----------------------
 OR t.fee = 'NA'
 OR t.fi = 'NA'
 OR t.fo = 'NA'
 OR t.fum = 'NA'

注意:请注意,不要将数字列与'NA'进行比较,因为MySQL会将'NA'评估为零的数值({ {1}})在数字上下文中。