这篇文章主要围绕用于重复键更新的SQL查询插入错误和sql重复键值什么意思展开,旨在为您提供一份详细的参考资料。我们将全面介绍用于重复键更新的SQL查询插入错误的优缺点,解答sql重复键值什么意思的相
这篇文章主要围绕用于重复键更新的SQL查询插入错误和sql重复键值什么意思展开,旨在为您提供一份详细的参考资料。我们将全面介绍用于重复键更新的SQL查询插入错误的优缺点,解答sql重复键值什么意思的相关问题,同时也会为您带来jpa – 使用联合和选择常量的SQL查询等效的SQL查询、mysql – 用于将值列表与任何顺序的字段列表匹配而不重复的SQL查询、MySQL 更新重复键更新记录(合并)、MySQL-忽略插入错误:重复输入的实用方法。
本文目录一览:- 用于重复键更新的SQL查询插入错误(sql重复键值什么意思)
- jpa – 使用联合和选择常量的SQL查询等效的SQL查询
- mysql – 用于将值列表与任何顺序的字段列表匹配而不重复的SQL查询
- MySQL 更新重复键更新记录(合并)
- MySQL-忽略插入错误:重复输入
用于重复键更新的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 KEY
Sql
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查询
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的实体是否是同一继承树的一部分.对,他们是.但是,如果我从他们的基类中选择,我不相信我会为不同的子实体指定不同的字符串常量,我会吗?如果我可以选择实体的类名而不是我提供的字符串,那也可能符合我的目的.但我不知道这是否可能.思考?
解决方法
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查询
我最近不得不编写一个查询来过滤一些如下所示的特定数据:
假设我有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 更新重复键更新记录(合并)?
我有一个具有以下架构的表 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-忽略插入错误:重复输入
我正在使用PHP。
请问什么是将新记录插入具有唯一字段的数据库的正确方法。我正在批量插入很多记录,我只想插入新记录,并且我不想重复条目有任何错误。
有没有唯一方法可以首先进行SELECT并查看条目是否在INSERT之前已经存在-并且仅在SELECT不返回任何记录时才插入INSERT?我希望不是。
我想以某种方式告诉MySQL忽略这些插入而没有任何错误。
谢谢
关于用于重复键更新的SQL查询插入错误和sql重复键值什么意思的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于jpa – 使用联合和选择常量的SQL查询等效的SQL查询、mysql – 用于将值列表与任何顺序的字段列表匹配而不重复的SQL查询、MySQL 更新重复键更新记录(合并)、MySQL-忽略插入错误:重复输入的相关知识,请在本站寻找。
本文标签: