GVKun编程网logo

用于重复键更新的SQL查询插入错误(sql重复键值什么意思)

10

这篇文章主要围绕用于重复键更新的SQL查询插入错误和sql重复键值什么意思展开,旨在为您提供一份详细的参考资料。我们将全面介绍用于重复键更新的SQL查询插入错误的优缺点,解答sql重复键值什么意思的相

这篇文章主要围绕用于重复键更新的SQL查询插入错误sql重复键值什么意思展开,旨在为您提供一份详细的参考资料。我们将全面介绍用于重复键更新的SQL查询插入错误的优缺点,解答sql重复键值什么意思的相关问题,同时也会为您带来jpa – 使用联合和选择常量的SQL查询等效的SQL查询、mysql – 用于将值列表与任何顺序的字段列表匹配而不重复的SQL查询、MySQL 更新重复键更新记录(合并)、MySQL-忽略插入错误:重复输入的实用方法。

本文目录一览:

用于重复键更新的SQL查询插入错误(sql重复键值什么意思)

用于重复键更新的SQL查询插入错误(sql重复键值什么意思)

我在以下查询中出错

INSERT INTO tableName3 (column1, column2)    SELECT         b.column1,        SUM (a.column2) AS SumColumn2    FROM         tableName1 AS a    JOIN         tableName2 AS b ON a.column1 = b.column2     GROUP BY         b.column2ON DUPLICATE KEY UPDATE tableName3   SET column2 = SUM (a.column2) AS SumColumn2

错误消息是

关键字“ ON *”附近的语法不正确

关键字“ AS”附近的语法不正确

如何解决?

答案1

小编典典

首先, 您的选择语句是错误的。

SELECT     b.column1,    SUM (a.column2) AS SumColumn2FROM     tableName1 AS aJOIN     tableName2 AS b ON a.column1 = b.column2 GROUP BY     b.column2

可能应该将其分组b.column1,否则,您将得到一个异常,因为select子句中的列必须出现在group by子句中或sql-
server中的聚合函数中

其次ON DUPLICATE KEYSql
server中没有指令。一个快速搜索发现,在这个许多人提到的MySQL,但MySQL的是 不是
SQL服务器。

要在Sql Server中实现这种行为,您可能应该使用MERGE语句。

您的代码应如下所示:

MERGE tableName3  AS targetUSING (    SELECT     b.column1,    SUM (a.column2) AS SumColumn2    FROM     tableName1 AS a    JOIN     tableName2 AS b ON a.column1 = b.column2     GROUP BY     b.column1) AS source (column1, SumColumn2)ON (target.column1= source.column1)WHEN MATCHED THEN     UPDATE SET column2= source.SumColumn2WHEN NOT MATCHED THEN    INSERT (column1, column2)    VALUES (source.column1, source.SumColumn2)

jpa – 使用联合和选择常量的SQL查询等效的SQL查询

jpa – 使用联合和选择常量的SQL查询等效的SQL查询

我编写了一个SQL查询,它基本上从许多表中选择,以确定哪些表具有自特定日期以来创建的行.我的sql看起来像这样:

SELECT widget_type FROM(
  SELECT 'A' as widget_type
  FROM widget_a
  WHERE creation_timestamp > :cutoff
  UNION
  SELECT 'B' as widget_type
  FROM widget_b
  WHERE creation_timestamp > :cutoff
) types
GROUP BY widget_type
HAVING count(*)>0

这在sql中运行良好,但我最近发现,虽然JPA可能会使用联合执行“每类表”多态查询,查询中为JPQL does not support unions.所以这让我想知道JPA是否有一个替代方案可以用来完成同样的事情.

实际上,我会查询十几个表,而不仅仅是两个表,所以我想避免单独查询.我还想避免出于可移植性原因而进行本机SQL查询.

在我上面链接的问题中,有人询问映射到widget_a和widget_b的实体是否是同一继承树的一部分.对,他们是.但是,如果我从他们的基类中选择,我不相信我会为不同的子实体指定不同的字符串常量,我会吗?如果我可以选择实体的类名而不是我提供的字符串,那也可能符合我的目的.但我不知道这是否可能.思考?

解决方法

我做了一些搜索,发现JPA的一个(看似模糊的)功能完全符合我的目的.我发现JPA 2有一个类型关键字,允许您将多态查询限制为特定的子类,如下所示:

SELECT widget
FROM BaseWidget widget
WHERE TYPE(widget) in (WidgetB,WidgetC)

我发现JPA(或至少Hibernate作为JPA实现)允许您不仅在约束中使用类型,还在选择列表中使用类型.这大约是我的查询结果如下:

SELECT disTINCT TYPE(widget)
FROM BaseWidget widget
WHERE widget.creationTimestamp > :cutoff

该查询返回Class对象的列表.我原来的查询是选择字符串文字,因为它最接近我在sql中所做的.在我的例子中,选择Class实际上更可取.但是如果我更喜欢根据实体的类型选择一个常量,那就是Oracle’s documentation用来说明case语句的确切场景:

SELECT p.name
CASE TYPE(p)
  WHEN Student THEN 'kid'
  WHEN Guardian THEN 'adult'
  WHEN Staff THEN 'adult'
  ELSE 'unkNown'
END
FROM Person p

mysql – 用于将值列表与任何顺序的字段列表匹配而不重复的SQL查询

mysql – 用于将值列表与任何顺序的字段列表匹配而不重复的SQL查询

我最近不得不编写一个查询来过滤一些如下所示的特定数据:

假设我有3个不同的值,我想在我的数据库中的一个表的3个不同字段中搜索,它们必须以所有可能的顺序搜索而不重复.

下面是一个示例(为了便于理解,我将使用命名查询表示法来显示必须放置值的位置):

val1 =“a”,val2 =“b”,val3 =“c”

这是我生成的查询:

SELECT * FROM table WHERE
(fieldA = :val1 AND fieldB = :val2 AND fieldC = :val3) OR
(fieldA = :val1 AND fieldB = :val3 AND fieldC = :val2) OR
(fieldA = :val2 AND fieldB = :val1 AND fieldC = :val3) OR
(fieldA = :val2 AND fieldB = :val3 AND fieldC = :val1) OR
(fieldA = :val3 AND fieldB = :val1 AND fieldC = :val2) OR
(fieldA = :val3 AND fieldB = :val2 AND fieldC = :val1)

我必须做的是生成一个模拟排列而不重复的查询.有没有更好的方法来执行此类查询?

对于3×3来说这是可以的,但如果我需要对9×9之类的更大的东西做同样的事情,那么生成查询将是一个巨大的混乱.

我正在使用MariaDB,但我可以接受可以在Postgresql上运行的答案.
(我想知道是否有一种聪明的方式来编写这种类型的查询而没有“暴力”)

最佳答案
没有更好的方法,但你可以使用:

SELECT *
FROM table
WHERE :val1 in (fieldA,fieldB,fieldC) and
      :val2 in (fieldA,fieldC) and
      :val3 in (fieldA,fieldC)

它至少更短.而且,这是标准的sql,因此它应该适用于任何数据库.

MySQL 更新重复键更新记录(合并)

MySQL 更新重复键更新记录(合并)

如何解决MySQL 更新重复键更新记录(合并)?

我有一个具有以下架构的表 products

CREATE TABLE `products` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,`user_id` bigint unsigned NOT NULL,`article_id` bigint unsigned NOT NULL,`price_cents` int unsigned NOT NULL,`quantity` smallint NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `idx_products_unique` (`user_id`,`article_id`,`price_cents`),KEY `fk_products_article` (`article_id`),CONSTRAINT `fk_products_article` FOREIGN KEY (`article_id`) REFERENCES `articles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `fk_products_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

现在我可以用这个查询做 INSERT:

INSERT INTO `products` (`user_id`,`price_cents`,`quantity`) 
VALUES (1,1,200,1) 
ON DUPLICATE KEY UPDATE `price_cents`=VALUES(`price_cents`),`quantity`=quantity+VALUES(`quantity`)

所以现在我有 1 个产品(ID 1),数量为 1,价格为 200。 现在我插入了另外 2 个产品:

INSERT INTO `products` (`user_id`,1),(1,199,`quantity`=quantity+VALUES(`quantity`)

现在我有 2 个产品,一个 (ID 1) 的数量为 2,价格为 200,另一个 (ID 2) 的数量为 1,价格为 199。

好。

问题来了:我想更新价格为199的产品并将新价格设置为200。我要做的是:

INSERT INTO `products` (`id`,`user_id`,`quantity`) 
VALUES (2,200) 
ON DUPLICATE KEY UPDATE `price_cents`=VALUES(`price_cents`),`quantity`=quantity+VALUES(`quantity`)

我想要的是 ID 为 1、价格为 200、数量为 3 的单个产品,但我得到 Number:0x426,Message: "Duplicate entry ''1-1-200'' for key ''products.idx_products_unique'',因为 MysqL 不会删除 ID 为 2 的产品。

有没有办法在 MysqL 中实现这一点(请记住,我想批量执行这些操作)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

MySQL-忽略插入错误:重复输入

MySQL-忽略插入错误:重复输入

我正在使用PHP。

请问什么是将新记录插入具有唯一字段的数据库的正确方法。我正在批量插入很多记录,我只想插入新记录,并且我不想重复条目有任何错误。

有没有唯一方法可以首先进行SELECT并查看条目是否在INSERT之前已经存在-并且仅在SELECT不返回任何记录时才插入INSERT?我希望不是。

我想以某种方式告诉MySQL忽略这些插入而没有任何错误。

谢谢

关于用于重复键更新的SQL查询插入错误sql重复键值什么意思的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于jpa – 使用联合和选择常量的SQL查询等效的SQL查询、mysql – 用于将值列表与任何顺序的字段列表匹配而不重复的SQL查询、MySQL 更新重复键更新记录(合并)、MySQL-忽略插入错误:重复输入的相关知识,请在本站寻找。

本文标签: