mysql如何插入数据_mysql insert into基本语法

1次阅读

mysql insert语句常见错误包括字段与值数量不匹配、漏括号、字符串未用单引号、使用中文标点等;支持多行插入,语法为insert into t(a,b) values (1,’x’),(2,’y’);insert ignore静默跳过重复键,on duplicate key update则执行更新;跨表插入需注意类型兼容、顺序一致及字符集转换风险。

mysql如何插入数据_mysql insert into基本语法

INSERT INTO 语句写法不对,MySQL 直接报错 Error 1064

常见错误是字段名和值数量不匹配、漏括号、字符串没加引号,或者用了中文标点。MySQL 对语法非常严格,INSERT INTO 后必须跟表名,再跟 VALUESselect,中间不能断。

  • 字段列表和值列表必须一一对应,个数、顺序、类型都要对得上
  • 字符串值必须用单引号 'abc',双引号在某些 SQL 模式下会报错
  • 插入 NULL 值时写 NULL(不带引号),不是 'NULL'
  • 如果省略字段名,就得给所有非空且无默认值的字段提供值

想插入多行数据,一条 INSERT 能不能搞定?

能,而且推荐——比发多条 INSERT 更快、更少网络往返。MySQL 支持在 VALUES 后面跟多组括号,每组对应一行。

  • 语法是:INSERT INTO table (a, b) VALUES (1, 'x'), (2, 'y'), (3, 'z');
  • 注意逗号分隔的是整行,不是字段;每行括号内字段顺序要一致
  • 单条语句插入上限受 max_allowed_packet 限制,超了会报 ERROR 2006
  • 如果其中某一行违反唯一键或非空约束,整条语句会失败(除非加 IGNORE

INSERT IGNORE 和 ON DUPLICATE KEY UPDATE 有什么区别?

两者都用来处理重复键冲突,但行为完全不同:一个静默跳过,一个主动更新。

  • INSERT IGNORE 遇到重复主键或唯一索引时,直接丢弃这一行,不报错也不插入,也不影响其他行
  • ON DUPLICATE KEY UPDATE 遇到冲突时,执行指定的更新操作,比如 INSERT INTO t (id, name) VALUES (1,'a') ON DUPLICATE KEY UPDATE name='b';
  • 后者可以引用新值:UPDATE count = count + 1,而 IGNORE 不支持任何后续逻辑
  • 注意:只有定义了主键或唯一索引的列触发冲突时,这两个机制才生效

从另一个表导入数据,用 INSERT … SELECT 还要注意啥?

这个写法很常用,但容易忽略字段类型隐式转换、NULL 处理和事务一致性。

  • 目标表字段类型必须兼容源表 SELECT 出来的值,否则可能截断或报错(如把长字符串插进 VARCHAR(10)
  • SELECT 中的列顺序要和 INSERT 的字段顺序一致,不依赖列名匹配
  • 如果源表有大量数据,建议加 LIMIT 分批插入,避免锁表太久或日志暴涨
  • 注意隔离级别:在 REPEATABLE READ 下,INSERT ... SELECT 会对源表做间隙锁,可能引发死锁

实际写的时候,最常被绕开又最容易出问题的,是字段类型和字符集隐式转换——尤其是从 utf8mb4 表往老 utf8 表插数据,或者把数字字符串当整数用。这些不会立刻报错,但数据可能被截断或变成 0。

text=ZqhQzanResources