我从excel表中插入大数据(数据包含NULL和' - ')。在数据库中,我有一个表,在源中有NULL时插入默认值。我希望桌子也应该为' - '
做CREATE TABLE Data (FarmerName varchar(100) DEFAULT('defaultvalue') ,
FatherName varchar(100) DEFAULT('defaultvalue') ,
Area varchar(100) DEFAULT('defaultvalue') );
任何人都可以提供帮助。感谢
答案 0 :(得分:1)
其中一个是适合您的选项吗?
设置
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
不支持这种递归触发器)