创建在插入期间用默认值替换“ - ”的表

时间:2016-12-03 18:01:24

标签: mysql sql

我从excel表中插入大数据(数据包含NULL和' - ')。在数据库中,我有一个表,在源中有NULL时插入默认值。我希望桌子也应该为' - '

CREATE TABLE Data (FarmerName varchar(100) DEFAULT('defaultvalue') ,
                    FatherName varchar(100) DEFAULT('defaultvalue') ,
                   Area varchar(100) DEFAULT('defaultvalue') );

任何人都可以提供帮助。感谢

2 个答案:

答案 0 :(得分:1)

其中一个是适合您的选项吗?

  1. 加载到临时表,然后使用INSERT INTO .. SELECT ...
  2. 创建一个掩盖' - '的视图,并对视图起作用,而不是直接针对该表。
  3. 添加一个掩盖' - '
  4. 的虚拟列

    演示

    设置

    create table t (id int,c1 varchar (100),c2 varchar(100));
    

    解决方案1 ​​

    设置

    create table t_stg (id int identity,c1 varchar (100),c2 varchar(100));
    

    流量

    truncate table t_stg;
    
    -- This insert simulates the bulk load
    insert into t_stg (id,c1,c2) values (1,'A','-'),(2,'-','B'),(3,'-','-');
    
    insert into t (id,c1,c2)    
    select  id
           ,case when c1 = '-' then 'DEF_C1' else c1 end  as c1
           ,case when c2 = '-' then 'DEF_C2' else c2 end  as c2
    from    t_stg 
    ;
    

    使用

    select * from t;
    
    +----+--------+--------+
    | id | c1     | c2     |
    +----+--------+--------+
    | 1  | A      | DEF_C2 |
    +----+--------+--------+
    | 2  | DEF_C1 | B      |
    +----+--------+--------+
    | 3  | DEF_C1 | DEF_C2 |
    +----+--------+--------+
    

    解决方案2

    设置

    create view t_v
    as
    select  id
       ,case when c1 = '-' then 'DEF_C1' else c1 end  as c1
       ,case when c2 = '-' then 'DEF_C2' else c2 end  as c2
    from    t_stg 
    ;
    

    流程

    -- This insert simulates the bulk load
    insert into t(id,c1,c2) values (1,'A','-'),(2,'-','B'),(3,'-','-');
    

    使用

    select * from t_v;
    
    +----+--------+--------+
    | id | c1     | c2     |
    +----+--------+--------+
    | 1  | A      | DEF_C2 |
    +----+--------+--------+
    | 2  | DEF_C1 | B      |
    +----+--------+--------+
    | 3  | DEF_C1 | DEF_C2 |
    +----+--------+--------+
    

    解决方案3

    设置

    alter table t add c1_v varchar(100) generated always as (case when c1 = '-' then 'DEF_C1' else c1 end) virtual;
    alter table t add c2_v varchar(100) generated always as (case when c2 = '-' then 'DEF_C2' else c2 end) virtual;
    

    流程

    -- This insert simulates the bulk load
    insert into t(id,c1,c2) values (1,'A','-'),(2,'-','B'),(3,'-','-');
    

    使用

    select * from t;
    
    +----+----+----+--------+--------+
    | id | c1 | c2 | c1_v   | c2_v   |
    +----+----+----+--------+--------+
    | 1  | A  | -  | A      | DEF_C2 |
    +----+----+----+--------+--------+
    | 2  | -  | B  | DEF_C1 | B      |
    +----+----+----+--------+--------+
    | 3  | -  | -  | DEF_C1 | DEF_C2 |
    +----+----+----+--------+--------+
    

答案 1 :(得分:0)

  

我希望桌子也应该为' - '

然后修改您的excel或csv文件,并将所有-替换为NULL,并使用该修改后的文件进行导入,可能使用LOAD DATA LOCAL INFILE

根据您运行的操作系统,使用脚本使用命令(OR)可以轻松地进行修改。请参阅此答案以获取该信息What type of data in csv will be null after load in mysql and pandas

根据您的评论不允许更改源数据... 然后一个可能的替代方案(可能不是解决方案)将在该表上使用BEFORE INSERT TRIGGER并在触发逻辑中用-替换那些NULL并执行INSERT但它会对你的情况下的批量插入产生不利影响(此外,MySQL不支持这种递归触发器)