MySQL INSERT multiple rows ON DUPLICATE KEY UPDATE ... WHERE EXISTS(子查询)
MySQL INSERT multiple rows ON DUPLICATE KEY UPDATE ... WHERE EXISTS(subquery)
我想将多行的值插入 table。此外,在重复的情况下,查询必须能够更新这些行。但我还想检查用户是否有权使用子查询写入 mytable
。我怎样才能在一条命令中做到这一点?
示例无效,因为 MySQL INSERT syntax 不支持 WHERE 子句:
INSERT INTO mytable (col1, col2, col3)
VALUES
(1, 2, 3),
(4, 5, 6),
(7, 8, 9)
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
WHERE EXISTS (subquery_to_verify_if_user_can_write_into_mytable);
对于单行,它可能看起来像这样(工作示例但只插入一行,而不是多行):
INSERT INTO mytable (col1, col2, col3)
SELECT 1, 2, 3 FROM accesstable WHERE my_condition_to_check_if_user_can_write_into_mytable LIMIT 1
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
但我想为多行插入值。
PS 第一分钟不错 -1 :))
稍后编辑
这是一个丑陋的解决方案。使用假的 dumb
列创建具有所需值的 table 并加入通过询问用户访问权限制作的假 table:
INSERT INTO mytable (col1, col2, col3)
SELECT t1.c1, t1.c2, t1.c3
FROM (
SELECT 1 c1, 2 c2, 3 c3, 0 dumb
UNION SELECT 4, 5, 6, 0
UNION SELECT 7, 8, 9, 0
) t1
JOIN (SELECT 0 dumb FROM accesstable WHERE user_id=114 LIMIT 1) t2
ON t1.dumb=t2.dumb
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
有没有人有更好的主意?我是数据库的初学者。我对最简单和最快的解决方案感兴趣。创建一个完整的假列并进行 JOIN 在我看来是相当昂贵的操作而且不太优雅。
改进的连接 谢谢@Nick:
INSERT INTO mytable (col1, col2, col3)
SELECT t1.*
FROM ((
SELECT 1 c1, 2 c2, 3 c3
UNION SELECT 4, 5, 6
UNION SELECT 7, 8, 9
) t1
CROSS JOIN (SELECT 1 FROM accesstable WHERE user_id=114 LIMIT 1) t2)
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
就个人而言,我会在应用层维护访问权限,并且只执行 INSERT
查询 如果 用户具有这些访问权限。如果您必须只在 MySQL 中执行此操作,您的最后一个查询几乎是您唯一的选择,尽管可以通过使用 CROSS JOIN
来简化(并提高效率);这样您就不需要虚拟列,因为 UNION
table 的所有行都将自动连接到访问检查中的单行(假设它是 returns 数据)。请注意,在我的查询中,出于演示目的,我添加了 id
键列:
INSERT INTO mytable (id, col1, col2, col3)
SELECT t1.*
FROM ((
SELECT 2 id, 1 col1, 2 col2, 3 col3
UNION SELECT 1, 4, 5, 6
UNION SELECT 3, 7, 8, 9
) t1
CROSS JOIN (SELECT 1 FROM accesstable WHERE user_id=114 LIMIT 1) t2
)
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
我想将多行的值插入 table。此外,在重复的情况下,查询必须能够更新这些行。但我还想检查用户是否有权使用子查询写入 mytable
。我怎样才能在一条命令中做到这一点?
示例无效,因为 MySQL INSERT syntax 不支持 WHERE 子句:
INSERT INTO mytable (col1, col2, col3)
VALUES
(1, 2, 3),
(4, 5, 6),
(7, 8, 9)
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
WHERE EXISTS (subquery_to_verify_if_user_can_write_into_mytable);
对于单行,它可能看起来像这样(工作示例但只插入一行,而不是多行):
INSERT INTO mytable (col1, col2, col3)
SELECT 1, 2, 3 FROM accesstable WHERE my_condition_to_check_if_user_can_write_into_mytable LIMIT 1
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
但我想为多行插入值。 PS 第一分钟不错 -1 :))
稍后编辑
这是一个丑陋的解决方案。使用假的 dumb
列创建具有所需值的 table 并加入通过询问用户访问权限制作的假 table:
INSERT INTO mytable (col1, col2, col3)
SELECT t1.c1, t1.c2, t1.c3
FROM (
SELECT 1 c1, 2 c2, 3 c3, 0 dumb
UNION SELECT 4, 5, 6, 0
UNION SELECT 7, 8, 9, 0
) t1
JOIN (SELECT 0 dumb FROM accesstable WHERE user_id=114 LIMIT 1) t2
ON t1.dumb=t2.dumb
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
有没有人有更好的主意?我是数据库的初学者。我对最简单和最快的解决方案感兴趣。创建一个完整的假列并进行 JOIN 在我看来是相当昂贵的操作而且不太优雅。
改进的连接 谢谢@Nick:
INSERT INTO mytable (col1, col2, col3)
SELECT t1.*
FROM ((
SELECT 1 c1, 2 c2, 3 c3
UNION SELECT 4, 5, 6
UNION SELECT 7, 8, 9
) t1
CROSS JOIN (SELECT 1 FROM accesstable WHERE user_id=114 LIMIT 1) t2)
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)
就个人而言,我会在应用层维护访问权限,并且只执行 INSERT
查询 如果 用户具有这些访问权限。如果您必须只在 MySQL 中执行此操作,您的最后一个查询几乎是您唯一的选择,尽管可以通过使用 CROSS JOIN
来简化(并提高效率);这样您就不需要虚拟列,因为 UNION
table 的所有行都将自动连接到访问检查中的单行(假设它是 returns 数据)。请注意,在我的查询中,出于演示目的,我添加了 id
键列:
INSERT INTO mytable (id, col1, col2, col3)
SELECT t1.*
FROM ((
SELECT 2 id, 1 col1, 2 col2, 3 col3
UNION SELECT 1, 4, 5, 6
UNION SELECT 3, 7, 8, 9
) t1
CROSS JOIN (SELECT 1 FROM accesstable WHERE user_id=114 LIMIT 1) t2
)
ON DUPLICATE KEY UPDATE
col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3)