mysql - 插入更新多行mysql

标签 mysql on-duplicate-key multiple-records multiple-insert

我需要将多条记录添加到 mysql 数据库中。我尝试了多个查询,它工作正常,但效率不高。所以我只用下面的一个查询尝试了一下,

INSERT INTO data (block, length, width, rows) VALUES
    ("BlockA", "200", "10", "20"),
    ("BlockB", "330", "8", "24"),
    ("BlockC", "430", "7", "36")
ON DUPLICATE KEY UPDATE 
    block=VALUES(block),
    length=VALUES(length),
    width=VALUES(width),
    rows=VALUES(rows)

但它总是更新表(列是 block_id、block、length、width、rows)。 我是否应该通过添加 block_id 对查询进行任何更改。 block_id 是主键。任何帮助将不胜感激。

最佳答案

我运行你的查询没有任何问题,你确定你没有用数据表定义其他键吗?还要确保为 id 字段设置了“自动递增”。没有 auto_increment,查询总是更新现有行

***** 已更新 **********

对不起,我弄错了你的问题。是的,只有一个 auto_increment 键,您查询将始终插入新行而不是更新现有行(因为主键是检测“现有”/重复的唯一方法),因为键是 auto_increment,如果插入查询中未给出主键。

我认为你想要实现的是不同的,你可能想在所有字段(即 block 、字段、宽度、行)上设置复合唯一键

顺便说一下,我已经为你设置了一个 SQL fiddle。 http://sqlfiddle.com/#!2/e7216/1

添加唯一键的语法:

CREATE TABLE `data` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`block` varchar(10) DEFAULT NULL,
`length` int(11) DEFAULT NULL,
`width` int(11) DEFAULT NULL,
`rows` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniqueme` (`block`,`length`,`width`,`rows`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

关于mysql - 插入更新多行mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18183703/

相关文章:

MySQL INSERT 多行 ON DUPLICATE KEY UPDATE ... WHERE EXISTS(子查询)

php - 如何使用子查询打印多行?

SQL 2005 将多条记录合并为一条

MySQL在一个查询中删除多行,每行唯一的条件

mysql - 在 MySQL 中查找列创建时间

mysql - SQL 存储过程 1 个插入需要 2 个插入语句和 1 个选择

mysql - 重复键更新 MySQL 不更新

mysql - 有条件的重复 key 更新

php - laravel query php 如何获取一个范围内的最大值

Mysql从excel导入新代码