如何批量更新mysql数据?如何定义这样的东西:
UPDATE `table`
WHERE `column1` = somevalues
SET `column2` = othervalues
Run Code Online (Sandbox Code Playgroud)
与某些值如下:
VALUES
('160009'),
('160010'),
('160011');
Run Code Online (Sandbox Code Playgroud)
和其他值:
VALUES
('val1'),
('val2'),
('val3');
Run Code Online (Sandbox Code Playgroud)
也许用mysql不可能?一个PHP脚本?
update_all如果我想更新包含各种不同值的300,000条记录的列,我该如何使用?
我想做的是:
Model.update_all(:column => [2,33,94,32]).where(:id => [22974,22975,22976,22977])
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这不起作用,而且对于300,000个条目来说更糟糕.
我通过简单的点击计数器跟踪访问我的所有http_user_agents.下面在数据库中插入http_user_agent,此字段为Case Insensitive且为Unique.因此,当我们尝试插入它并找到DUPLICATE KEY时,它会向hits字段添加1.
问题是我的自动增量字段仍然增加,即使我们没有插入字段.我怎么能阻止这个?
$sql = "INSERT INTO `db_agency_cloud`.`tblRefHttpUsersAgent` SET `http_users_agent` = :UsersAgent, `created_ts` = NOW() ON DUPLICATE KEY UPDATE `hits` = `hits` + 1";
Run Code Online (Sandbox Code Playgroud)
这是表结构:
CREATE TABLE `tblRefHttpUsersAgent`
(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`http_users_agent` varchar(255) NOT NULL,
`hits` int(20) unsigned NOT NULL DEFAULT '1',
`created_ts` datetime NOT NULL,
`activity_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `http_users_agent` (`http_users_agent`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
Run Code Online (Sandbox Code Playgroud) 我有一个带有自动增量主键的 MySql 表,似乎所有各种 upsert 方法(INSERT IGNORE 和 ON DUPLICATE KEY UPDATE)都受到自动增量字段增量的影响,甚至如果一行被更新但没有插入。这意味着在表格中引入了间隙,我认为这是不可取的。
所以问题是:如果 upsert 实际上只是更新行,是否有任何方法可以在具有自动递增字段的表中更新记录而不自动递增该字段。在我看来,这是 upsert 应该表现的方式,但似乎并非如此。
我目前具有包括一次关键问题ID被设置为auto increment.它不断增加ON DUPLICATE KEY.
例如:
ID | field1 | field2
1 | user | value
5 | secondUser | value
86 | thirdUser | value
Run Code Online (Sandbox Code Playgroud)
从上面的描述中,您会注意到我在该表中有3个输入但由于每次更新时自动递增,因此第三个输入的ID为86.
反正有没有避免这个?
这是我的mySQL查询的样子:
INSERT INTO table ( field1, field2 ) VALUES (:value1, :value2)
ON DUPLICATE KEY
UPDATE field1 = :value1, field2 = :value2
Run Code Online (Sandbox Code Playgroud)
这就是我的桌子的样子;
CREATE TABLE IF NOT EXISTS `table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`field1` varchar(200) NOT NULL,
`field2` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY …Run Code Online (Sandbox Code Playgroud) 我想在Laravel中批量更新我的记录,但是记录没有更新。每个ID都有不同的记录。以下是我正在尝试的。
$ids = [5,6,8,9],
$updated_array = [
['name' => 'tarun'],
['name' => 'Akash'],
['name' => 'Soniya'],
['name' => 'Shalu'],
];
Model::whereIn('id', $ids)->update($updated_array);
Run Code Online (Sandbox Code Playgroud) 我目前有一个 SQL 执行脚本,它更新重复键上的行,如下所示。
$stmt = $dbCon->prepare("INSERT INTO videos_rating (videos_rating_video_fk, "
. " videos_rating_user_fk, "
. " videos_rating_rating) "
. " VALUES (:video_id, "
. " :user_id, "
. " :video_rating) "
. " ON DUPLICATE KEY UPDATE videos_rating_rating = :video_rating");
Run Code Online (Sandbox Code Playgroud)
该脚本工作正常,但有没有办法防止自动增量列不同步?
假设我们从一个空表开始,然后我对一个视频进行评分,然后创建一个 id 为 1 的行,然后用户通过对同一视频评分较低或较高来再次执行 SQL,并且该行将被更新因为它现在是重复的密钥,所以肯定没问题。
问题是这样的。
下次另一个用户对新视频进行评分时,该行将从 id 3 而不是 2 开始?
表格将如下所示
id | videos_rating_user_fk | videos_rating_rating
1 | 1 | 4
3 | 2 | 5
Run Code Online (Sandbox Code Playgroud)
我无法找到类似的问题,即使我发现其他人不太可能对此感到困扰,如果是这样,请让我参考那篇文章。
我知道 ids 不应该“看起来不错”,但是 ids 从 30 - 51 - …
mysql ×6
php ×3
bulk ×2
innodb ×2
activerecord ×1
database ×1
eloquent ×1
laravel ×1
sql ×1
sql-update ×1
update-all ×1
upsert ×1