我在NHibernate中执行标准更新到单个属性.但是在提交事务时,sql update似乎设置了我在表上映射的所有字段,即使它们没有更改.当然这在Nhibernate中不是正常行为吗?难道我做错了什么?谢谢
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var singleMeeting = session.Load<Meeting>(10193);
singleMeeting.Subject = "This is a test 2";
transaction.Commit();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个更新语句,更新字段x,y和z,其中id = xx.
在表格中,我有一些不同的x_created_datetime字段(对于不同人员维护/输入的记录的不同部分).我想编写一个单独的查询,如果为null,将更新此字段,但如果不为null则不管它.
所以我拥有的是:
UPDATE newspapers
SET scan_notes = "data",
scan_entered_by = "some_name",
scan_modified_date = "current_unix_timestamp"
WHERE id = X
Run Code Online (Sandbox Code Playgroud)
我需要的是一种添加以下内容的方法,但仍然总是更新以上内容:
scan_created_date = "current_unix_timestamp"
where scan_created_date is null
Run Code Online (Sandbox Code Playgroud)
我希望我能在没有第二笔交易的情况下做到这一点.有关如何实现这一目标的任何想法?
我正在建立一个通过各种CSV Feed更新大量数据的系统.通常我会循环遍历Feed中的每一行,执行select查询以检查项目是否已存在,并根据项目是否存在插入/更新项目.
我觉得这种方法的可扩展性不高,可能会使服务器在更大的源上运行.我的解决方案是正常循环项目,但将它们存储在内存中.然后,对于每100个左右的项目,对这100个项目进行选择,并获得数据库中匹配的现有项目列表.然后将insert/update语句连接在一起并将它们运行到数据库中.这基本上可以减少到数据库的行程.
这是一个可扩展的解决方案吗?是否有关于将大型Feed导入生产环境的示例教程?
谢谢
这很容易,已被多次询问,但我无法让它工作.我认为应该工作的SQL查询是:
UPDATE table2
SET dst.a = dst.a + src.a,
dst.b = dst.b + src.b,
dst.c = dst.c + src.c,
dst.d = dst.d + src.d,
dst.e = dst.e + src.e
FROM table2 AS dst
INNER JOIN table1 AS src
ON dst.f = src.f
Run Code Online (Sandbox Code Playgroud) 我是MySQL的初学者,我不小心创建了一个名为列的表
(price decimal(2,2));
Run Code Online (Sandbox Code Playgroud)
它需要decimal(4,2)允许4位数.既然我已经创建了它,那么将该十进制值更新为最简单的方法是什么decimal(4,2)?或者我是否需要完全删除该列,并使用正确的数字重新创建它?
我似乎无法正确使用语法.
非常感谢你.
我已经到处搜索这种情况,除了动态SQL之外找不到解决方案,我不想使用它.
这是我想在服务器2上更新的表:
(Stuff Id UNIQUEIDENTIFIER
, stuffname NVARCHAR(64))
Run Code Online (Sandbox Code Playgroud)
我需要从服务器1更新它.
所以我一直在尝试这个:
DECLARE @newstuff nvarchar(64)
SELECT @newstuff = 'new stuff'
UPDATE [server2].database2.dbo.Stuff
SET stuffname=@newstuff
WHERE stuffId='4893CD93-08B3-4981-851B-5DC972288290'
Run Code Online (Sandbox Code Playgroud)
这需要11秒.下一个使用文字在1秒内运行
UPDATE [server2].database2.dbo.Stuff
SET stuffname='new stuff'
WHERE stuffId='4893CD93-08B3-4981-851B-5DC972288290'
Run Code Online (Sandbox Code Playgroud)
我比较了实际的执行计划.速度较慢的是远程扫描需要100%的成本,另外还有5个其他步骤(过滤器,表假脱机,计算标量,远程更新,更新).快速的只是执行UPDATE和远程查询步骤.我需要使用变量,所以我需要一种方法来强制它远程执行整个查询.
我尝试过使用OPTION(RECOMPILE)但是server1正在使用SQL Server 2005.server2正在使用SQL Server 2012.我无法在服务器2上更改数据库结构而不会出现严重问题.我没有任何身份验证问题.我在更新时尝试对表进行别名.
我也尝试过使用Openquery.当我将id过滤器放在查询字符串中时,它会回落到1秒以下:
UPDATE OPENQUERY([server2], 'select stuffname, stuffid from database2.dbo.stufftable where contactid=''4CA1D489-9221-E511-A441-005056C00008''')
SET stuffname = @newstuff
Run Code Online (Sandbox Code Playgroud)
但是我需要id也是一个变量,而open查询不需要变量(https://msdn.microsoft.com/en-CA/library/ms188427.aspx).我尝试使用查询外部的id过滤器运行Openquery,但是在4秒内运行.它比11好,但不是很好:
UPDATE OPENQUERY([server2],'select stuffname, stuffid from database2.dbo.stufftable')
set stuffname=@newstuff
where contactid='4CA1D489-9221-E511-A441-005056C00008'
Run Code Online (Sandbox Code Playgroud)
当然,我使用exec(@sql)运行openquery,但我真的不想这样做.我可以使用文字来完成整个更新语句,甚至不使用OPENQUERY并获得相同类型的结果.
有没有办法让我在不使用exec(@sql)的情况下修复此性能?
我在表格中做了一个错误的更新查询.
我忘了在WHERE条款中创建一个id字段.
这样就更新了我的所有行.
如何恢复?
我没有备份....
我有一个按排名顺序显示的标签表.为确保没有两行可以具有相同的排名,它们的值是唯一的:
create table label (
id_label serial not null,
rank integer not null,
title text not null,
constraint pri primary key (id_label),
constraint unq unique (rank)
)
Run Code Online (Sandbox Code Playgroud)
无论是PostgreSQL还是MySQL,它们都表现出相同的行为.查询可能看起来像select title from label order by rank.假设该表包含:
id_label rank title
1 10 Cow
2 20 Apple
3 45 Horse
4 60 Beer
Run Code Online (Sandbox Code Playgroud)
现在假设我想重新排序两个标签,例如让Apple排在Cow之前.最简单的方法是交换他们的等级值:
update label
set rank = case when rank = 20 then 10 else 20 end
where id_label in (1,2)
Run Code Online (Sandbox Code Playgroud)
不.也不:
update label
set rank = case when rank …Run Code Online (Sandbox Code Playgroud) 对于性能,哪种选项对于要更新的大型数据集更好?
使用CASE语句或个人更新查询?
案例:
UPDATE tbl_name SET field_name =
CASE
WHEN condition_1 THEN 'Blah'
WHEN condition_2 THEN 'Foo'
WHEN condition_x THEN 123
ELSE 'bar'
END AS value
Run Code Online (Sandbox Code Playgroud)
个人查询示例:
UPDATE tbl_name SET field_name = 'Blah' WHERE field_name = condition_1
UPDATE tbl_name SET field_name = 'Foo' WHERE field_name = condition_2
UPDATE tbl_name SET field_name = 123 WHERE field_name = condition_x
UPDATE tbl_name SET field_name = 'bar' WHERE field_name = condition_y
Run Code Online (Sandbox Code Playgroud)
注意:大约300,000条记录将被更新,CASE语句将有大约10,000条WHEN条件.如果使用单个查询,它也是大约10,000
我有一个用PHP编写的脚本,它有一行正常工作,可以选择我需要的数据;
$result = mysql_query("SELECT product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2'", $db_beb);
Run Code Online (Sandbox Code Playgroud)
我正在努力的是一种更新我选择的记录的方法,一旦选中我需要更改,status = '1'以便下次我的脚本运行时它不会在选择中提取相同的数据而只会提取新的项目具有状态2的表.
这是我的工作成果,感谢下面接受的答案的评论;
$result = mysql_query("SELECT id, product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2' FOR UPDATE", $db_beb);
while($row = mysql_fetch_assoc($result))
{
$sql_table_data[] = $row;
mysql_query("UPDATE supplier_dropship_items SET status=1 WHERE id='".$row['id']."'", $db_beb);
}
Run Code Online (Sandbox Code Playgroud) sql-update ×10
sql ×8
mysql ×5
postgresql ×2
alter-table ×1
case ×1
csv ×1
decimal ×1
feeds ×1
join ×1
nhibernate ×1
null ×1
openquery ×1
performance ×1
select ×1
sql-insert ×1
sql-server ×1
sqlite ×1