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行,而我不需要更多,如何停止从文件中登录?如何保存当前加载的行,并停止加载?
试试这个:
- 使用
LOAD DATA INFILE .. IGNORE ..
- 将临时触发器添加到此表,如下所示
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;
。变量必须严格设置在同一连接中!!!如果使用了其他变量的名称,则变量的名称不得与其他变量名称发生冲突。