PingKai Logo下载

插入数据

本文档介绍如何使用 SQL 语言结合不同编程语言向 TiDB 插入数据。

在开始之前

在阅读本文档之前,你需要准备以下内容:

插入行

有两种方式可以插入多行数据。例如,如果你需要插入 3 个玩家的数据。

  • 多行插入语句:

    INSERT INTO `player` (`id`, `coins`, `goods`) VALUES (1, 1000, 1), (2, 230, 2), (3, 300, 5);
  • 多个 单行插入语句:

    INSERT INTO `player` (`id`, `coins`, `goods`) VALUES (1, 1000, 1);
    INSERT INTO `player` (`id`, `coins`, `goods`) VALUES (2, 230, 2);
    INSERT INTO `player` (`id`, `coins`, `goods`) VALUES (3, 300, 5);

一般来说,多行插入语句 的执行速度比多个 单行插入语句 更快。

CREATE TABLE `player` (`id` INT, `coins` INT, `goods` INT);
INSERT INTO `player` (`id`, `coins`, `goods`) VALUES (1, 1000, 1), (2, 230, 2);

关于如何使用此 SQL 的更多信息,请参见 连接到 TiDB 集群,并按照步骤在连接到 TiDB 集群后使用客户端输入 SQL 语句。

批量插入

如果你需要快速导入大量数据到 TiDB 集群,建议使用 平凯星辰 提供的数据迁移工具。使用 INSERT 语句并不是最佳方案,因为效率较低且需要自己处理异常和其他问题。

以下是推荐的批量导入工具:

  • 数据导出:Dumpling。可以将 MySQL 或 TiDB 数据导出到本地或 Amazon S3。
  • 数据导入:可以通过 Data Migration 将 MySQL 兼容数据库迁移到平凯数据库云服务。
  • 数据复制:TiDB Data Migration。可以将 MySQL、MariaDB 和 Amazon Aurora 数据库复制到 TiDB。还支持合并和迁移源数据库中的分片实例和表。

避免热点

在设计表时,需要考虑是否存在大量插入操作。如果存在,则需要在表设计时避免热点。请参见 选择主键 部分,并遵循 选择主键的规则。

使用 AUTO_RANDOM 主键插入数据

如果你插入的表的主键具有 AUTO_RANDOM 属性,则默认情况下不能指定主键。例如,在 bookshop 数据库中,可以看到 users 表 的 id 字段包含 AUTO_RANDOM 属性。

在这种情况下,你不能使用如下 SQL 进行插入:

INSERT INTO `bookshop`.`users` (`id`, `balance`, `nickname`) VALUES (1, 0.00, 'nicky');

会出现错误:

ERROR 8216 (HY000): Invalid auto random: Explicit insertion on auto_random column is disabled. Try to set @@allow_auto_random_explicit_insert = true.

不建议在插入时手动指定 AUTO_RANDOM 列。

处理此错误的两种方案:

  • (推荐)将此列从插入语句中移除,使用 TiDB 初始化的 AUTO_RANDOM 值。这符合 AUTO_RANDOM 的语义。

    INSERT INTO `bookshop`.`users` (`balance`, `nickname`) VALUES (0.00, 'nicky');
  • 如果你确定必须指定此列,可以使用 SET 语句 来允许在插入时指定 AUTO_RANDOM 列,通过修改用户变量实现。

    SET @@allow_auto_random_explicit_insert = true;
    INSERT INTO `bookshop`.`users` (`id`, `balance`, `nickname`) VALUES (1, 0.00, 'nicky');

使用 HTAP

在 TiDB 中,HTAP 功能让你在插入数据时无需执行额外操作。没有额外的插入逻辑。TiDB 会自动保证数据一致性。你只需在创建表后 开启列存副本同步,即可直接使用列存副本加速查询。

需要帮助?

在 Discord 或 Slack 社区提问,或 提交支持工单。