mySQL 加载数据 - 第 1 行不包含所有列的数据

mySQL Load Data - Row 1 doesn't contain data for all columns

我看过很多关于这个主题的类似问题。但是 none 似乎适用。 详情如下:

我有一个有 8 列的 table。

create table test (
node_name varchar(200),
parent  varchar(200),
actv int(11),
fid int(11),
cb varchar(100),
co datetime,
ub varchar(100),
uo datetime
);

table上有触发器:

CREATE TRIGGER before_insert_test
BEFORE INSERT ON test
FOR EACH ROW SET NEW.co = now(), NEW.uo = now(), NEW.cb = user(), NEW.ub = user()

我有一个要加载到此 table 中的 csv 文件。它只有 2 列。 前几行:

node_name,parent
West,
East,
BBB: someone,West
Quebec,East
Ontario,East
Manitoba,West
British Columbia,West
Atlantic,East
Alberta,West

我在 mySQL 5.6 环境中设置了这一切。使用 python 和 SQLAlchemy,我 运行 文件的加载没有问题。它为前 2 条记录中的第二个字段加载所有带有空字符串的记录。一切如预期。

我有一个mysql 8 的环境,和运行 完全相同的例程。所有相同的语句等。它失败并显示“第 1 行不包含所有列的数据”错误。

使用此连接:

engine = create_engine(
connection_string,
pool_size=6, max_overflow=10, encoding='latin1', isolation_level='AUTOCOMMIT',
connect_args={"local_infile": 1}
)
db_connection = engine.connect()

我放在 sql 变量中的命令是:

LOAD DATA INFILE 'test.csv' 
INTO TABLE test 
FIELDS TERMINATED BY ','  ENCLOSED BY '\"' IGNORE 1 LINES SET fid = 526, actv = 1;

并执行它:

    db_connection.execute(sql)

所以..我基本上加载文件的前两列..我设置加载语句中的下两列,最后 4 个由 触发器 .

处理

我再说一遍 - 这在 mysql 5 环境中运行良好,但在 mysql 8.

中运行良好

我检查了两个数据库环境中的 mysql 字符集变量,它们是等价的(以防 5.6 和 8 之间的默认字符集变化产生影响)。

我会说 mySQL 5 db 运行ning 在 ubuntu 18.04.5 而 mySQL 8 运行ning 在 ubuntu 20.02.2 - 那里会不会有东西?

我已经尝试过对 LOAD DATA 语句进行各种调整。我尝试为文件中的前两条记录填充数据,以防万一。我尝试在 LOAD 语句中使用不同的行终止符。 .我不知道接下来要调查什么.. 谢谢指点..

MySQL 将假定您的 CSV 中的每一行都映射到 table 中的一列,除非您另有说明。

为查询提供一个列列表:

LOAD DATA INFILE 'test.csv' 
INTO TABLE test 
FIELDS TERMINATED BY ','  
ENCLOSED BY '\"' 
IGNORE 1 LINES 
(node_name, parent)
SET fid = 526, actv = 1;

除了Tangentially Perpendicular的答案,还有其他选项:

  1. 按照以下方式添加 IGNORE 关键字: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#ignore-effect-on-execution 根据 https://dev.mysql.com/doc/refman/8.0/en/load-data.html.

    ,它应该位于 LOAD DATA 语句中的“INTO”之前
  2. 或者,将 sql_mode 改得不那么严格也可以。

由于严格的 sql_mode,LOAD DATA 不够智能,无法意识到 TRIGGERS 正在处理几列。如果他们将其增强为那么智能就好了。但是唉。