【发布时间】:2021-03-13 18:46:13
【问题描述】:
请参阅第一个问题之后的此问题的更新部分。
我有两个表,一个用于包含 id、users_id、image、pcimagename 的视频,和 视频网址 列;另一个用于包含 id、users_id、file_name、user_file_name 和 usage_count 的图像strong> 列。
两个表的主键是 id 列,它们是自动递增的,但是两个 id 值彼此不相关。 images 表的 file_name 列也有一个唯一键。 usage_count 列的默认值为 1。
phpMyAdmin 显示以下有关我正在使用的 mySQL 数据库的信息:
Database server
Server: Localhost via UNIX socket
Server type: MariaDB
Server version: 5.5.52-MariaDB - MariaDB Server
Protocol version: 10
Server charset: UTF-8 Unicode (utf8)
我的目标是,每当要从视频表中删除一行时,我想首先将视频表中的图像信息复制到图像表中,如果图像(特别是 file_name 列值)在 images 表中不存在,将 usage_count 设置为 1,但是,如果图像确实存在,我想增加 usage_count 减 1 并执行更新。我搜索了“mySQL INSERT or UPDATE”并想出了 INSERT ... ON DUPLCATE KEY UPDATE 变体,这似乎是我想要做的。
但是,我以前从未使用过 INSERT ... ON DUPLICATE KEY UPDATE ... 语句。查看MySQL INSERT ON DUPLICATE KEY UPDATE 和Insert into a MySQL table or update if exists 页面,我想到了以下内容;不幸的是,我现在可以连接到我的数据库,所以我无法确定它是否正确:
INSERT
INTO `photos`
( `users_id`, `file_name`, `user_file_name` )
SELECT `users_id`, `image`, `pcimagename`
FROM `videos`
WHERE `status` = \'Deleted\'
AND `last_updated_on` <= DATE_SUB( NOW(), INTERVAL 1 DAY )
AND `tracks_id` = 0
ON DUPLICATE KEY UPDATE usage_count = VALUES( usage_count ) + 1;
我的问题是:
-
语法是否正确,具体来说:
1a) ON DUPLICATE 短语的位置是否正确?
1b) 我是否需要将 SELECT 语句括在括号中,我已经看到了可以使用的示例和其他没有的示例。
-
UPDATE usage_count = VALUES(usage_count) + 1 短语是否会导致插入图像表的每一行在该行的预插入 usage_count 值上加 1,或者所有来自的行SELECT FROM videos 的值是否相同?我对 ON DUPLICAT 语句的这一部分实际上是如何工作的了解不多。大多数示例只是分配了一个固定值。
更新
在使用 Anina 提供的 dbFiddle 时,我注意到运行以下 INSERT 语句并没有像我预期的那样增加:
After several INSERT ... ON DUPLICATE KEY UPDATE ... statements the test
table contains:
id val test action comment
1 1 2 update
2 2 2 update
3 3 1 insert
Perform another INSERT ... ON DUPLICATE KEY UPDATE ... statement,
this time to increment val 1, expecting that the test column should increment to 3.
INSERT INTO test (val )
VALUES ( 1 )
ON DUPLICATE KEY UPDATE test = VALUES( test ) + 1,
action = 'update',
comment = 'Why isn''t test 3?';
However ....
id val test action comment
1 1 2 update Why isn't test 3?
2 2 2 update
3 3 1 insert
表的创建如下:
CREATE TABLE test ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY( ID ),
val INT NOT NULL, UNIQUE( val ),
test INT DEFAULT 1,
action VARCHAR( 10 ) DEFAULT 'insert',
comment VARCHAR( 30 ) );
谢谢
【问题讨论】:
-
ON DUPLICATE KEY UPDATE photos set usage_count = usage_count + 1;手册页很清楚see the manual -
UPDATE usage_count = VALUES( usage_count ) + 1短语是否会导致插入图像表的每一行在行的预插入usage_count值上加 1,或者所有来自 @987654333 的行@ 被赋予相同的值? 既不是第一个也不是第二个。仔细阅读关于 VALUES() 函数操作的参考手册。 -
fiddle - 调查。
-
谢谢大家。 Anina,你的小提琴对我关于 ON DUPICATE KEY 阶段的 VALUES() 表达式如何工作的问题很有帮助。
-
RiggsFolly,我没有为 INSERT ... ON DUPLICATE KEY UPDATE 语句打开 MySQL 5.6 参考手册页面,因为对于 v5.6,手册页中该页面的最早版本,以及我正在使用的 mySQL 版本的一个过去版本,它没有回答我所有的问题,或者如果回答了,我觉得它不够清楚,所以我错过了我在发布的问题中提出的问题,这里。不是说明书的错。这就是为什么我在这里问我的问题。但是,感谢您为阅读此问题并希望了解有关该条款的任何人添加链接。
标签: mysql insert-update