首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL数据导入两个问题解决

MySQL数据导入两个问题解决

作者头像
bisal
发布2026-03-12 16:49:22
发布2026-03-12 16:49:22
170
举报

点击标题下「蓝色微信名」可快速关注

最近做个测试数据导入的工作,碰到两个问题,还是能引申出一些知识点。

(1)导入数据出现类型转换错误

我们通过dbeaver客户端导入csv文件格式的数据,可能会碰到这个问题,

提示说'IS_DEL'是数值型,但是当前传入的数据是个字符串,之前一直很困惑,打开csv文件,看到都是数值,怎么有字符串?

其实就是因为这个csv中带了表头,第一行的'IS_DEL'是个string,数据库导入时,无法将其转成合法的数值类型,才会抛这个错。

解决方案就是将配置中的"标题位置"选择"top"(默认是"none"),导入的时候,就会自动过滤第一行,不会出现数据类型转换的错误。

(2)复制表结构提示需要主键错误

Oracle数据库中复制一张表我们通常用CTAS,即Create Table ... AS select ...,它会将相关的属性都复制过来,但MySQL中,如果用CTAS,可能会提示这个问题,

代码语言:javascript
复制
SQL 错误 [3750] [HY000]: Unable to create or change a table without a primary key, 
when the system variable 'sql_require_primary_key' is set. 
Add a primary key to the table or unset this variable to avoid 
this message. Note that tables without a primary key can 
cause performance problems in row-based replication, 
so please consult your DBA before changing this setting.

意思就是不能创建一张没有主键的表,或者设置sql_require_primary_key参数,允许表可以没有主键。On the other hand,通过CTAS创建的表,没有复制主键,MySQL复制表,有几种操作方案,

方法1:使用 CREATE TABLE ... LIKE

代码语言:javascript
复制
复制表结构,包括索引、约束等,但不复制数据
CREATE TABLE 新表名 LIKE 原表名;
示例,CREATE TABLE users_copy LIKE users;

方法2:使用 CREATE TABLE ... SELECT 配合 WHERE 1=0

代码语言:javascript
复制
复制表结构,但不会复制索引和约束
CREATE TABLE 新表名 AS SELECT * FROM 原表名 WHERE 1=0;
示例,CREATE TABLE users_copy AS SELECT * FROM users WHERE 1=0;

方法3:完整复制表结构+数据

代码语言:javascript
复制
复制表结构+数据
CREATE TABLE 新表名 AS SELECT * FROM 原表名;
示例,CREATE TABLE users_copy AS SELECT * FROM users;

方法4:使用 SHOW CREATE TABLE

代码语言:javascript
复制
1. 查看原表的创建语句
SHOW CREATE TABLE 原表名;

2. 修改表名后执行创建语句
示例输出:
CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,   
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

3. 修改表名后创建新表
CREATE TABLE users_copy (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
代码语言:javascript
复制
几种方案的对比,

如果只需要复制结构,推荐使用第一种。如果复制结构和数据,推荐第三种。如果跨数据库复制的场景,可以用第一种,

代码语言:javascript
复制
复制到另一个数据库
CREATE TABLE 目标数据库.新表名 LIKE 源数据库.原表名;

示例
CREATE TABLE db2.users_copy LIKE db1.users;

注意事项,

(1)使用 LIKE 不会复制原表的触发器。

(2)使用 SELECT 方式不会复制原表的索引和约束。

(3)如果只需要部分字段,可以在 SELECT 中指定。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bisal的个人杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档