标签: sql-update

SQL更新其连接值的SUM

我正在尝试将数据库中的字段更新为其连接值的总和:

UPDATE P
SET extrasPrice = SUM(E.price)
FROM dbo.BookingPitchExtras AS E
INNER JOIN dbo.BookingPitches AS P ON E.pitchID = P.ID
    AND P.bookingID = 1
WHERE E.[required] = 1
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到以下错误:

"An aggregate may not appear in the set list of an UPDATE statement."
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

sql sum sql-update

47
推荐指数
2
解决办法
9万
查看次数

找出SQL查询的历史记录

在服务器上执行了更新SQL查询,这在以后引起了许多问题.

如何获取最近2个月内执行的更新查询列表,以便我可以跟踪确切的有问题的SQL查询?

oracle database-administration sql-update

46
推荐指数
3
解决办法
26万
查看次数

PostgreSQL中的批量/批量更新/ upsert

我正在编写一个Django-ORM增强版,它尝试缓存模型并推迟模型保存直到事务结束.这几乎已经完成,但是我在SQL语法中遇到了意想不到的困难.

我不是一个DBA,但据我所知,数据库并不能真正有效地处理许多小问题.几个更大的查询要好得多.例如,最好使用大批量插入(比如一次100行)而不是100个单行.

现在,从我所看到的,SQL并没有真正提供任何语句来对表执行批量更新.这个词似乎令人困惑,我会解释我的意思.我有一个任意数据数组,每个条目描述一个表中的一行.我想更新表中的某些行,每个行都使用数组中相应条目的数据.这个想法非常类似于批量插入.

例如:我的表可以有两列"id""some_col".现在描述用于在批处理更新的数据阵列由三个条目的(1, 'first updated'),(2, 'second updated')(3, 'third updated').更新前表中包含行:(1, 'first'),(2, 'second'),(3, 'third').

我来到这篇文章:

为什么批量插入/更新更快?批量更新如何工作?

这似乎做我想要的,但我最终无法弄清楚语法.

我还可以删除所有需要更新的行,并使用批量插入重新插入它们,但我发现很难相信这实际上会更好.

我使用PostgreSQL 8.4,因此这里也可以使用一些存储过程.然而,当我计划最终开源项目时,任何更便携的想法或方法在不同的RDBMS上做同样的事情是最受欢迎的.

后续问题:如何批量"插入或更新"/"upsert"语句?

检测结果

我已经执行了100次10次插入操作,分布在4个不同的表中(总共1000个插入).我使用PostgreSQL 8.4后端在Django 1.3上进行了测试.

这些是结果:

  • 通过Django ORM完成的所有操作 - 每次通过~2.45秒,
  • 相同的操作,但没有Django ORM - 每次通过~1.48秒,
  • 只插入操作,而不查询数据库的序列值~0.72秒,
  • 仅插入操作,以10块为单位执行(总共100块)~0.19秒,
  • 只插入操作,一个大的执行块~0.13秒.
  • 只插入操作,每块大约250条语句,~0.12秒.

结论:在单个connection.execute()中执行尽可能多的操作.Django本身带来了巨大的开销.

免责声明:除了默认主键索引之外,我没有引入任何索引,因此插入操作可能会因此而运行得更快.

sql database postgresql insert sql-update

45
推荐指数
4
解决办法
7万
查看次数

运行UPDATE时... datetime = NOW(); 更新的所有行都具有相同的日期/时间吗?

当你运行类似于:

UPDATE table SET datetime = NOW();
Run Code Online (Sandbox Code Playgroud)

在具有1 000 000 000条记录的表上,查询需要10秒才能运行,所有行是否具有完全相同的时间(分钟和秒),还是会有不同的时间?换句话说,是时候是查询开始还是每行更新?

我正在运行MySQL,但我认为这适用于所有dbs.

mysql sql datetime sql-update

42
推荐指数
3
解决办法
9万
查看次数

SQL Server更新组

我试图在MS-SQL上执行此操作,但只是在逐行返回错误

update #temp
Set Dos=Count(1)
From Temp_Table2010 s
where Id=s.Total and s.total in (Select Id from #temp)
group by s.Total
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个性能良好的问题.

sql group-by sql-update

42
推荐指数
3
解决办法
7万
查看次数

在mysql中逐步更新值

对于所有行,我的表字段的一个字段设置为0.但我想在更新查询中通过步骤1更新为增量值.

我怎么能在mysql中做到这一点?

mysql sql-update

42
推荐指数
3
解决办法
2万
查看次数

仅使用SQL返回pre-UPDATE列值 - PostgreSQL版本

我有一个相关的问题,但这是我的谜题的另一部分.

我想从UPDATEd的行中获取列的OLD VALUE - 不使用触发器(也不使用存储过程,也不使用任何其他额外的非SQL /查询实体).

我的查询是这样的:

   UPDATE my_table
      SET processing_by = our_id_info -- unique to this worker
    WHERE trans_nbr IN (
                        SELECT trans_nbr
                          FROM my_table
                         GROUP BY trans_nbr
                        HAVING COUNT(trans_nbr) > 1
                         LIMIT our_limit_to_have_single_process_grab
                       )
RETURNING row_id;
Run Code Online (Sandbox Code Playgroud)

如果我可以在子查询结束时执行"FOR UPDATE ON my_table",那将是devine(并修复我的其他问题/问题).但是,这不起作用:不能有这个AND"GROUP BY"(这对于计算trans_nbr的COUNT是必要的).然后我可以直接使用那些trans_nbr并进行查询以获得(即将成为)之前的processing_by值.

我尝试过这样做:

   UPDATE my_table
      SET processing_by = our_id_info -- unique to this worker
     FROM my_table old_my_table
     JOIN (
             SELECT trans_nbr
               FROM my_table
           GROUP BY trans_nbr
             HAVING COUNT(trans_nbr) > 1
              LIMIT our_limit_to_have_single_process_grab
          ) sub_my_table
       ON old_my_table.trans_nbr = sub_my_table.trans_nbr …
Run Code Online (Sandbox Code Playgroud)

sql postgresql subquery sql-update

42
推荐指数
3
解决办法
2万
查看次数

用if条件更新mysql

似乎我对条件查询有很大的问题:(我必须做一个有条件的更新.我在这里写下我想做的事情:

 if(select tipo from abbonamento where idU=17)='punti' then     
 update abbonamento set punti=punti-1 
 else
 update abbonamento set bonus=bonus-1
Run Code Online (Sandbox Code Playgroud)

显然这不起作用.任何的想法?

mysql sql sql-update

42
推荐指数
1
解决办法
8万
查看次数

如果更新值为null,请不要更新列

我有这样的查询(在函数中):

UPDATE some_table SET
  column_1 = param_1,
  column_2 = param_2,
  column_3 = param_3,
  column_4 = param_4,
  column_5 = param_5
WHERE id = some_id;
Run Code Online (Sandbox Code Playgroud)

param_x我的函数的参数在哪里.有没有办法不更新那些param的列NULL?例如-如果param_4param_5NULL,然后只更新前三列,离开旧值column_4column_5.

我现在这样做的方式是:

SELECT * INTO temp_row FROM some_table WHERE id = some_id;

UPDATE some_table SET
  column_1 = COALESCE(param_1, temp_row.column_1),
  column_2 = COALESCE(param_2, temp_row.column_2),
  column_3 = COALESCE(param_3, temp_row.column_3),
  column_4 = COALESCE(param_4, temp_row.column_4),
  column_5 = COALESCE(param_5, temp_row.column_5)
WHERE id = some_id;
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

sql postgresql null sql-update

41
推荐指数
3
解决办法
2万
查看次数

高级MySql查询:使用另一个表中的信息更新表

我想用另一个表中的数据更新mySql中的表.

我有两个表"人"和"业务".人员表通过名为"business_id"的列链接到业务表.

必要的表结构,主键是星号(表:列):人物:*business_id,*sort_order,电子邮件业务:*business_id,电子邮件

我想用人员表中的电子邮件更新业务表电子邮件列,就像这样(我知道我在这里遗漏了一些东西):

UPDATE business b SET email = (SELECT email  from People p where p.business_id = b.business_id AND sort_order = '1') WHERE b.email = ''; 
Run Code Online (Sandbox Code Playgroud)

这有意义吗?可能吗?

mysql sql-update

40
推荐指数
2
解决办法
8万
查看次数