Mysql 创建替换'-';在插入过程中使用默认值
我正在从excel工作表插入大量数据(数据包含NULL和“-”)。在数据库中,我有一个表,在源中有空值的地方插入默认值。我想这张桌子也应该这样做Mysql 创建替换'-';在插入过程中使用默认值,mysql,sql,Mysql,Sql,我正在从excel工作表插入大量数据(数据包含NULL和“-”)。在数据库中,我有一个表,在源中有空值的地方插入默认值。我想这张桌子也应该这样做 CREATE TABLE Data (FarmerName varchar(100) DEFAULT('defaultvalue') , FatherName varchar(100) DEFAULT('defaultvalue') , Area varchar(100) D
CREATE TABLE Data (FarmerName varchar(100) DEFAULT('defaultvalue') ,
FatherName varchar(100) DEFAULT('defaultvalue') ,
Area varchar(100) DEFAULT('defaultvalue') );
有人能帮忙吗。谢谢
我想这张桌子也应该这样做
CREATE TABLE Data (FarmerName varchar(100) DEFAULT('defaultvalue') ,
FatherName varchar(100) DEFAULT('defaultvalue') ,
Area varchar(100) DEFAULT('defaultvalue') );
然后修改excel或csv文件,将所有出现的-
替换为NULL
,并使用修改后的文件进行导入,可能需要使用加载数据本地填充
根据您运行的操作系统,可以使用命令(或)使用脚本轻松完成修改。有关这些信息,请参见此答案
根据您的评论,不允许更改源数据。。。
然后,一个可能的替代方案(可能不是解决方案)是在该表上插入触发器之前设置一个
,-
,并在触发器逻辑中将这些-
替换为NULL
,然后执行插入
,但这将对批量插入产生不利影响,这就是您的情况(此外,这种递归触发器在MySQL
中不受支持)其中之一对您有效吗
加载到暂存表,然后使用INSERT INTO..选择
创建一个遮罩“-”的视图,并对该视图而不是直接对表进行操作
添加遮罩'-'的虚拟列
演示
设置
解决方案1
设置
流动
使用
解决方案2
设置
流动
使用
解决方案3
设置
流动
使用
然后ALTER
您的表应该更改什么…?表和他的列然后您可以设置默认值“-”如果我重新创建表,在上面的查询中应该更改什么。您可以解释一下您可以使用CHECK
进行更改,但是很抱歉,MySQLI不支持CHECK约束。不同的列有不同的默认值。如创建表数据(FarmerName varchar(100)DEFAULT('defaultvalue1')、FatherName varchar(100)DEFAULT('defaultvalue2')、Area varchar(100)DEFAULT('defaultvalue3'));您认为这是一个什么问题?回答已被接受。请您解释一下暂存表。我正在用c#编写代码,无法加载(暂存)Datatable中的完整表,因为它包含非常大的数据
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 |
+----+--------+--------+
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 |
+----+--------+--------+
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 |
+----+----+----+--------+--------+