加载数据文件中断



MySQL的第一个命令行:

use usersbase;
LOAD DATA LOCAL INFILE 'D:/base/users.txt' 
INTO TABLE users
FIELDS TERMINATED BY ',';

第二:

use usersbase;
set session transaction isolation level read uncommitted;
select count(1) from users;

如果我看到用户表有n行,而我不需要更多,如何停止从文件中登录?如何保存当前加载的行,并停止加载?

试试这个:

  1. 使用LOAD DATA INFILE .. IGNORE ..
  2. 将临时触发器添加到此表,如下所示
CREATE TRIGGER prevent_excess_lines_insertion
BEFORE INSERT 
ON users
FOR EACH ROW 
BEGIN
IF 50000 < (SELECT COUNT(*) FROM USERS) THEN
SET NEW.id = 1;
END IF;
END

加载行时,对表中的行数(要插入的行除外(进行计数,并将其与预定义的行数进行比较(50000(。

如果当前行数小于,则插入该行。

如果达到了预定义的数量,则一些预定义的值(1(被分配给主键列。这会导致唯一约束冲突,由于IGNORE修饰符,该冲突被忽略。

在这种情况下,将加载整个文件(但只插入所需的行数(。

若要中断进程,则删除IGNORE修饰符,并将SET语句替换为设置一般SQL错误的SIGNAL,加载进程将终止。

不要忘记在执行导入后立即删除触发器。


注意,InnoDB中的COUNT(*)在大表上可能非常慢。在每次插入之前执行此操作可能会使负载需要一段时间。–Barmar

这是真的:(

您可以使用用户定义的变量,而不是查询表中的行数。触发将是

CREATE TRIGGER prevent_excess_lines_insertion
BEFORE INSERT 
ON users
FOR EACH ROW 
BEGIN
IF (@needed_count := @needed_count - 1) < 0 THEN
SET NEW.id = 1;
END IF;
END

插入之前,必须将此变量设置为要加载的行数,例如SET @needed_count := 50000;。变量必须严格设置在同一连接中!!!如果使用了其他变量的名称,则变量的名称不得与其他变量名称发生冲突。

最新更新