使用 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_val1和Tab1_val2,然后创建一个更新列的触发器Tab1_valInfo。
create trigger utr_ValInfo on Table1
after insert as
begin
declare @size int = 4;
declare …Run Code Online (Sandbox Code Playgroud) 我需要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”有一个条目,但不能从查询的这部分引用它。
先感谢您
我有一个具有以下定义的表:
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()函数与#-运算符结合使用(首先从数组中删除值,然后使用更新的状态附加到它)。
我该怎么做?
我必须更新一个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}'。
在写更新语句之前,我应该检查它是否存在吗?
有人告诉我这样做
所以它避免了无用的写入事务日志中已经存在的值,
并且只需要一个允许其他读取的共享锁而不是一个排他锁。
他们说想象一个事务像这样针对不同的值多次运行,你会一直使用排他锁而不是共享锁。
同事提到,看锁兼容性图表,搜索时不能有两个更新锁,但可以有两个共享锁。因此,当“搜索要更新的行”没有要更新的值时,假更新锁可以阻止真正的更新。有人可以使此声明无效吗?
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)同样的问题,除了现在删除,我应该检查它是否存在吗?
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 在事务期间都会持有 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) 我想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) 我正在努力处理随机返回多行而不是一行的查询。我正在使用 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是主键。
它是通过一系列集成测试执行的。当我只执行上述查询的测试时,我没有任何问题。但是,当我执行所有测试时,我随机得到多行。你有什么建议吗?
添加新类别和更改现有类别时,我需要为类别设置自定义顺序。我相信代码和 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) 我有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 中不匹配。
感谢你的帮助..