标签: update

如何判断是插入还是更新

每当在 CUSTOMER 表中发生 INSERT 时,我需要调用“ StoredProcedure1 ”并且在 CUSTOMER 表中发生 UPDATE,我需要在触发器中调用“ StoredProcedure2 ”。 如何确定是在 SQL Server 2008的触发器中插入还是更新

有人可以请帮我如何解决?

代码:

CREATE TRIGGER Notifications ON CUSTOMER
FOR INSERT,UPDATE
AS
BEGIN
DECLARE @recordId varchar(20);
set @recordId= new.Id;
    //if trigger is insert at the time I call to SP1
        EXEC StoredProcedure1 @recordId
    //if trigger is Upadeted at the time I call to SP2
        EXEC StoredProcedure2 @recordId
END
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2008 insert update

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

更新语句给出无效的列名错误,即使该列存在

我在此存储过程开始时创建了一个临时表。它创建成功,可以从中选择和插入。这是创建语句

CREATE TABLE #tmpImportData 
( GuideFirstName VARCHAR(MAX), 
  GuideLastName VARCHAR(MAX), 
  email VARCHAR(MAX), 
  group_id_text VARCHAR(MAX), 
  CandidateName VARCHAR(MAX), 
  grade_text VARCHAR(5), 
  dateofbirth DATE
)
Run Code Online (Sandbox Code Playgroud)

我的问题是在更改临时表后尝试更新列。我收到错误:

消息 207,级别 16,状态 1
无效的列名

代码:

declare @SQl1 nvarchar(max)
set @SQL1 ='
ALTER TABLE #tmpImportData 
ADD group_id INT
ALTER TABLE #tmpImportData 
ADD guide_id INT
ALTER TABLE #tmpImportData 
ADD password_plain_text VARCHAR(500)
ALTER TABLE #tmpImportData 
ADD guide_email VARCHAR(500)
ALTER TABLE #tmpImportData 
ADD class_id INT'

exec sp_executesql @Sql1

UPDATE #tmpImportData 
SET group_id = CAST(group_id_text AS INT)

UPDATE #tmpImportData 
SET group_id = 0 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql alter-table update temporary-tables

5
推荐指数
1
解决办法
2万
查看次数

更新以前工作过的大表,现在需要几个小时

背景:我正在使用非生产 SQL Server 来操作大型数据集并运行一些基本计算。我拥有的原始数据文件大约有 30M 行,缺少记录(不是 NULL;它们不存在,但由于超出我判断的原因,它们必须存在)。所以我基本上为所有应该在那里的行和列(总共 6 列)创建了一个“shell”表——这个表大约有 80M 行。

问题:我需要帮助的步骤是在 80M 行表的顶部覆盖原始 30M 行。(所有30M行根据三列的值在大表中都有匹配的记录,其余三列当前为空,需要用原始数据覆盖。)

我成功地为更大的数据集(40M/100M 表)完成了这个过程,这个过程大约需要 4 个小时。没关系 - 这是一次性的事情。但是当我在这个较小的数据集上运行它时,它运行了 10 多个小时。我第一次遇到超时错误。我试过调整一些东西并再运行两次,但我在大约 10 个小时后取消了查询,认为我可以尝试其他的东西。

关于为什么它第一次在更大的桌子上工作,而不是在这个较小的桌子上有什么想法?关于如何使代码更高效或清除某个文件中的某些内容的任何想法?

代码:

update [shelltable]
set shelltable.column4 = originaltable.column4, 
    shelltable.column5 = originaltable.column5, 
    shelltable.column6 = originaltable.column6
from shelltable left join original table
  on shelltable.column1 = originaltable.column1 and
     shelltable.column2 = originaltable.column2 and
     shelltable.column3 = originaltable.column3;
Run Code Online (Sandbox Code Playgroud)

自从尝试失败以来我尝试过的事情:

  • 重新启动 SQL Server 实例,以便清除 tembdb
  • 重新启动电脑
  • 将 SET 子句中的列数减少到 1(我会为每列 4-6 重新运行)
  • 更新两个表的统计信息
  • Ran DB Tuning Engine,它在更大的表上推荐并创建了一个索引
  • 添加了“WHERE originaltable.column4 is not …

performance sql-server update query-performance

5
推荐指数
1
解决办法
346
查看次数

如何在不锁定 MySQL 的情况下更新(非常)大的表

我有一个大表(58+ 百万条记录),它表示第二个表中两条记录(玩家和目标)之间的关系。

不幸的是,设计我们模式的人并没有考虑周全,而是选择使用用户名来表示这种关系,而不是用户记录的数字 ID。随着事情的进展(就像他们通常所做的那样),我们的用户名不再是玩家的有效唯一表示,因此我需要将这些关系转换为使用数字 ID。

多亏了 Percona Toolkit,在不加锁的情况下添加字段很容易,它提供了 pt-online-schema-change 可以在实时表上进行 ALTER。但是,填充表格可能会更棘手。

表格看起来像这样(我已经剥离了不相关字段的创建),两个未填充的字段是player_idtarget_id

CREATE TABLE `player_targets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `player` varchar(20) NOT NULL,
  `player_id` int(10) unsigned DEFAULT NULL,
  `target` varchar(20) NOT NULL,
  `target_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=58000000 DEFAULT CHARSET=latin1;

CREATE TABLE 'player_uuids' (
  `id`int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=600000 DEFAUL CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

我打算用这样的查询填充两个新字段:

UPDATE player_targets t
INNER JOIN player_uuids u1
  ON …
Run Code Online (Sandbox Code Playgroud)

mysql myisam locking update

5
推荐指数
1
解决办法
2万
查看次数

如何使执行连接的 Postgres 视图可更新?

我有两张桌子,products并且subscriptions

CREATE TABLE products (
    id bigint NOT NULL,
    title character varying(75),
    description text,
    manufacturer_id bigint,
    created_at timestamp without time zone,
    updated_at timestamp without time zone,
    mpn text,
    visible boolean DEFAULT false NOT NULL
);

CREATE TABLE subscriptions (
    id bigint NOT NULL,
    product_id bigint NOT NULL,
    user_id bigint NOT NULL,
    created_at timestamp without time zone,
    updated_at timestamp without time zone
);
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我通常需要知道某个产品的订阅者数量,而在应用程序中所有正确位置使用此逻辑是很棘手的。所以我想products用已经包含该信息的视图替换该表。所以我这样做了:

ALTER TABLE ONLY products
  RENAME TO products_raw;

CREATE VIEW products AS …
Run Code Online (Sandbox Code Playgroud)

postgresql join view update

5
推荐指数
1
解决办法
3121
查看次数

更新具有不同随机日期的 PostgreSQL 表

我在 PostgreSQL、Employee 和 Leave 中有两个表,如下所示:

CREATE TEMP TABLE employee_table AS SELECT
  id::int,
  name::text
FROM ( VALUES
  (1, 'John' ),
  (2, 'David')  
) AS t(id, name);

CREATE TEMP TABLE leave_table AS SELECT
  id::int,
  leave_date::date,
  emp_id::int
FROM ( VALUES
  (1, '01/10/1993' ,1),
  (2, Null         ,1),
  (3, Null         ,1),
  (4, '02/12/1990' ,2),
  (5, Null         ,2),
  (6, Null         ,2) 
) AS t(ID,Leave_Date,Emp_ID);
Run Code Online (Sandbox Code Playgroud)

我想更新 Leave 表并将 Leave_Date 列设置为每个员工的随机日期,可能是 01/01/2000,但如果员工在 Leave 表中有多个空条目,我想用两个不同的日期更新他的空条目这意味着一名员工在休假表中不应有两个相同的 Leave_Date 值,更新后我的休假表应如下所示:

ID        Leave_Date    Emp_ID  
1         01/10/1993      1  
2         01/01/2000      1  
3         01/01/2001      1 …
Run Code Online (Sandbox Code Playgroud)

postgresql update

5
推荐指数
1
解决办法
4533
查看次数

查询计划问题

我创建了一个 varbinary 哈希来检查 2 个表之间的更改。

这是执行计划,我对索引有点困惑,或者确实有更好的编写方式。 https://www.brentozar.com/pastetheplan/?id=HkHmqoczm

连接中的 2 列是目标中的 PK,并且在源中具有非聚集索引。困扰我的一点是排序导致的 tempdb 溢出。

sql-server query execution-plan update

5
推荐指数
1
解决办法
237
查看次数

为什么在这个 UPDATE 计划中有一个聚合?

鉴于这种

declare @Data table (id int, fact char(1));
declare @Summary table (id int, collected varchar(99));

insert @Data(id, fact)
values
    (1, 'a'),
    (1, 'b'),
    (2, 'c'),
    (2, 'd'),
    (2, 'e');

-- Form a list of unique id values
insert @Summary(id, collected) select distinct id, '' from @Data;

-- Accumulate the fact values into collected
update s
set collected = collected + d.fact
from @Summary as s
inner join @Data as d
    on d.id = s.id;

select * from @Summary;
Run Code Online (Sandbox Code Playgroud)

我曾预料

id …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan update

5
推荐指数
1
解决办法
437
查看次数

使用 NOEXPAND 更新索引视图

我先说这是来自 Stack Overflow 上一个未回答问题的交叉帖子
我这样做并不是为了获得对这个问题的更多看法,我希望 DBA 社区分享他们对这是否可能是 SQL Server 中的错误的看法。我认为 SO 社区没有专业知识来决定这一点,所以我在这里重新发布。


假设我有一个 table T,并且我有一个索引视图V

CREATE TABLE dbo.T (id int PRIMARY KEY, b bit NOT NULL, txt varchar(20));
GO
CREATE VIEW dbo.V
WITH SCHEMABINDING AS
  SELECT T.Id, T.txt
  FROM dbo.T AS T
  WHERE T.b = 1;
GO
CREATE UNIQUE CLUSTERED INDEX idx_V ON dbo.V (Id);
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,它基本上只是一个过滤索引,但它也可以有连接等。

我现在想在Twhere 中选择一些行,这里b = 1的过滤视图非常有用,我在标准上所以必须使用NOEXPAND(或者它对于视图匹配来说太复杂了):

SELECT Id, txt
FROM V WITH (NOEXPAND);
Run Code Online (Sandbox Code Playgroud)

这很好用。

现在我想将这些行更新为某个值。该视图符合可更新条件,因此我可以执行以下操作: …

sql-server t-sql materialized-view update

5
推荐指数
1
解决办法
211
查看次数

PostgreSQL 更新加入与 SQL Server 更新加入

我最近开始将个人项目从 Microsoft SQL Server 转换为 PostgreSQL,我对UPDATE JOIN在两个表之间执行时遇到的糟糕性能感到惊讶。

假设它们看起来像:

CREATE TABLE foo (
  id INTEGER NOT NULL PRIMARY KEY,
  bar INTEGER NULL
);

CREATE TABLE foo2 (
  id INTEGER NOT NULL PRIMARY KEY,
  bar INTEGER NULL
);
Run Code Online (Sandbox Code Playgroud)

在 T-SQL 中,我会使用这样的连接来进行更新:

UPDATE foo
SET bar = t2.bar
FROM foo t1
JOIN foo2 t2
ON t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)

但是在 Postgres 中运行,查询速度非常慢。

如果我将其更改为:

UPDATE foo
SET bar = t2.bar
FROM foo2 t2
WHERE foo.id = t2.id;
Run Code Online (Sandbox Code Playgroud)

这不是问题。

我知道语法是不同的,但我希望查询优化器能在同一个球场上解决一些问题。相反,事情变得疯狂。除了语法差异之外,我看不到的两个查询之间是否存在细微差别?

解释计划

Update on foo …
Run Code Online (Sandbox Code Playgroud)

postgresql join sql-server update

5
推荐指数
1
解决办法
438
查看次数