标签: update

如何使用触发器中新插入的同一行的值更新列?

使用 SQL Server 2014,我有这个:

Table1
Tab1_id        int identity(1,1) primary key
Tab1_val1      smallint
Tab1_val2      smallint
Tab1_valInfo   varchar(10) -- not yet implemented, will be used only for presentation
Run Code Online (Sandbox Code Playgroud)
 Tab1_id |   Tab1_val1 |   Tab1_val2 | Tab1_valInfo
---------|-------------|-------------|--------------
       1 |          25 |          19 | 0025-0019
       2 |           0 |           5 | 0000-0005
       3 |          12 |           3 | 0012-0003
Run Code Online (Sandbox Code Playgroud)

现在,凭借我相当短的 SQL 经验,我正在尝试的是:

在应用程序中,插入数据所需的唯一输入值是Tab1_val1Tab1_val2,然后创建一个更新列的触发器Tab1_valInfo

create trigger utr_ValInfo on Table1
after insert as
begin

    declare @size int = 4;

    declare …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server update sql-server-2014

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

如何从 UPDATE 子查询函数访问行值?

我需要UPDATE这样使用:

update offer set (bank, bank_id) = (cost, gid)
from (
select cost, osm_points.gid from pgr_kdijkstraCost(
  'SELECT gid as id, source, target, walk_cost as cost FROM ways',
  offer.vertice_id,
  array(select vertice_id from osm_points where super_type = 'bank'),
  false,false)
join osm_points on id2 = vertice_id
where cost != -1
and osm_points.super_type = 'bank'
order by cost
limit 1)t ;
Run Code Online (Sandbox Code Playgroud)

但我得到以下信息:

错误:对表“offer”的 FROM 子句条目的引用无效

提示:表“offer”有一个条目,但不能从查询的这部分引用它。

先感谢您

postgresql subquery update

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

如何更新复杂的 jsonb 列?

我有一个具有以下定义的表:

create table json_test (
    filter_data jsonb);
Run Code Online (Sandbox Code Playgroud)

我插入这样的值:

'{"task_packets": [
    {
        "state": "PROCEEDING",
        "task_id": 1001
    },
    {
        "state": "REVERTING",
        "task_id": 1002
    }
]}'
Run Code Online (Sandbox Code Playgroud)

现在我想将此jsonb列更新为:

'{"task_packets": [
    {
        "state": "DONE",
        "task_id": 1001
    },
    {
        "state": "REVERTING",
        "task_id": 1002
    }
]}'
Run Code Online (Sandbox Code Playgroud)

即我想使用指定的task_id内部 task_packets 数组更改值的状态。我建议以某种方式将jsonb_set()函数与#-运算符结合使用(首先从数组中删除值,然后使用更新的状态附加到它)。
我该怎么做?

postgresql update json postgresql-9.5

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

从 SELECT 更新 BIGINT[] 列

我必须更新一个bigint[]名为permissao_ver.
示例值:'{1,2,3,4,5,11,44,56,75,11}'.

伪代码:

UPDATE callcenter.pausa  
SET permissao_ver = '{"(SELECT cod_grupo FROM crm.usuariosgrupos
                        WHERE habilitar = 1)"}'::bigint[] 
WHERE habilitado = 1 AND permissao_ver is null
Run Code Online (Sandbox Code Playgroud)

我需要获取上面选择的代码将以与bigint[]列匹配的格式返回。喜欢:'{XX, XX, XX, X, XX, X}'

postgresql update array postgresql-9.2

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

如果在更新或删除之前存在?

  1. 在写更新语句之前,我应该检查它是否存在吗?

    有人告诉我这样做

    1. 所以它避免了无用的写入事务日志中已经存在的值,

    2. 并且只需要一个允许其他读取的共享锁而不是一个排他锁。
      他们说想象一个事务像这样针对不同的值多次运行,你会一直使用排他锁而不是共享锁。

    3. 同事提到,看锁兼容性图表,搜索时不能有两个更新锁,但可以有两个共享锁。因此,当“搜索要更新的行”没有要更新的值时,假更新锁可以阻止真正的更新。有人可以使此声明无效吗?

      if not exists 
      (
          select FavoriteColor 
          from dbo.Person 
          where Name = 'Bob' 
          and FavoriteColor = 'Green'
      )
      update dbo.Person
      set FavoriteColor = 'Green'
      where Name = 'Bob'
      
      Run Code Online (Sandbox Code Playgroud)
  2. 同样的问题,除了现在删除,我应该检查它是否存在吗?

    if exists 
    (
        select FavoriteColor 
        from dbo.Person 
        where Name = 'Bob' 
        and FavoriteColor = 'Green'
    )
    delete dbo.Person
    where Name = 'Bob' and FavoriteColor = 'Green'
    
    Run Code Online (Sandbox Code Playgroud)

我们使用 SQL Server 2016。

sql-server delete ddl update sql-server-2016

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

U锁的持续时间是多少

据我所知,无论使用哪种隔离级别,SQL Server 在事务期间都会持有 X 锁。U锁呢?如果一个事务在 UPDATE 语句中读取了 100 条记录(U 锁)但只更新了 10 条记录,那么在更新完成后,如果 tran 仍然打开,我们会得到 90-U 和 10-X 吗?

回应以下大卫的回答:不,这些情况不相关(感谢您的回答!)。我无法发布代码,因为我手头没有电脑,但我将尝试简要描述这种情况。我有一堆。我更新了,更新了10条记录。问:我们会在 ... 点有任何 U 锁,还是在获得 X 锁后释放它们?谢谢!

Begin tran;

Update t
Set b = 10
Where a = 1;
...
Run Code Online (Sandbox Code Playgroud)

sql-server locking update

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

加入另一个表进行更新

我想cities_extended.city_id根据加入进行更新cities

桌子 cities

CREATE TABLE `cities` (
  `id` int(11) NOT NULL,
  `city` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `state_code` char(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `state_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `cities`
  ADD PRIMARY KEY (`id`);
Run Code Online (Sandbox Code Playgroud)

桌子 cities_extended

CREATE TABLE `cities_extended` (
  `id` int(11) NOT NULL,
  `city` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `state_code` char(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `zip` int(5) UNSIGNED …
Run Code Online (Sandbox Code Playgroud)

mysql join update

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

带有子查询 LIMIT 1 的 UPDATE 返回多行

我正在努力处理随机返回多行而不是一行的查询。我正在使用 PostgreSQL 9.4.12

查询如下:

UPDATE folder as f set locked = 'locked', date_locked = current_timestamp 
from (
    SELECT * from folder as f2 
    WHERE f2.locked = 'available'
    LIMIT 1 FOR UPDATE ) as folderToUpdate 
WHERE f.id = folderToUpdate.id returning f.*
Run Code Online (Sandbox Code Playgroud)

id是主键。

它是通过一系列集成测试执行的。当我只执行上述查询的测试时,我没有任何问题。但是,当我执行所有测试时,我随机得到多行。你有什么建议吗?

postgresql concurrency update postgresql-9.4

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

更改行时如何更新其他行的“sorting_order”列?

添加新类别和更改现有类别时,我需要为类别设置自定义顺序。我相信代码和 sql 查询在两种情况下都是相同的。在我的webshop_categories-table 中,我有一个so-column(排序顺序 INT),我用它来确定应将类别输出给查看器的顺序。

这是我的类别表外观的简化示例(so = sort_order):

id  |   name   |  so
--------------------
1   |   Shoes  |  1
2   |   Hats   |  2
3   |   Bags   |  3
4   |   Coats  |  4
5   |   Rings  |  5
Run Code Online (Sandbox Code Playgroud)

添加新类别时,无需定义排序顺序,我只需提交一个表单,然后运行如下查询:

$so = $dbh->query('SELECT (MAX(so)+1) FROM webshop_categories WHERE so != 0')->fetchColumn();
$ins = $dbh->prepare('INSERT INTO webshop_categories (name, so)')->execute([$_POST['name'], $so]);  
Run Code Online (Sandbox Code Playgroud)

(这将添加一个新类别,并将其放在最后。在这种情况下,so将设置为 6)

这是添加新类别的非常基本的方法。工作正常。但是在大多数情况下,在处理类别时,需要将其按特定顺序进行展示。

但通常在添加新类别时,人们会希望指定该新类别相对于现有类别应放置的位置。那时更新so-column 对我来说是一个脑筋急转弯......

我用于添加新类别的简化表格:

<form>
  <input type="text" name="name">
  <select name="so">
    <option value="0" …
Run Code Online (Sandbox Code Playgroud)

mysql php sorting update

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

在 DB2 中使用选择更新

我有2张桌子

Table A 
address_id email
12341      aba@mail.com
12342      abb@mail.com
12343      abc@mail.com
12344      abd@mail.com
12345      abe@mail.com
12346      abf@mail.com
12347      abg@mail.com
12348      abh@mail.com
12349      abi@mail.com

Table B 
address_id email
12342      xyz@mail.com
12344      xyy@mail.com
12349      xyx@mail.com
Run Code Online (Sandbox Code Playgroud)

我想用表 B 中 address_id 匹配的电子邮件更新表 A 中的电子邮件。

我试过下面的查询:

update TableA A 
set email=(select email from TableB B where A.address_id=B.address_id) 
Run Code Online (Sandbox Code Playgroud)

但是它将所有电子邮件更新为 null,其中 address_id 在 TableA 中不匹配。

感谢你的帮助..

db2 update

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