对检查表的记录上次更新、修改或删除时间的一些研究使我找到了称为 ora_rowscn 的伪列。
首先,我这样做:
select max(ora_rowscn) from tablename;
我记下了这个数字。然后我执行插入、更新和删除,检查每个之前和之后的最大值。它似乎随着每种类型的变化而增加。
如果您想知道我为什么要这样做,我们会在 C# windows 服务中缓存实体列表。此服务在两个负载平衡的服务器上运行,因此每个服务器都有一个单独的实例运行。当服务器 A 上发生更新时,服务器 B 需要知道它。我想要做的是将 max(ora_rowscn) 缓存到一个变量中。每次我们的应用程序插入、更新或删除一条记录时,它都会从数据库中获得一个新的最大值。如果值不同,那么它显然知道它需要从数据库中获取一个新列表。
所以我的实际问题是:是否还有其他我应该注意的问题可能会导致插入、更新或删除记录而不增加该值?
编辑:有人可以添加ora_rowscn为标签吗?
我有一个现在有 1200 万条记录的 mysql 表,我正在尝试使用以下 UPDATE 代码更新列(排名):
SET @r=0;
UPDATE records SET rank= @r:= (@r+1) where type = 2 ORDER BY seconds DESC;
Run Code Online (Sandbox Code Playgroud)
几乎每分钟都会插入新行。所以,一小时后,我有几行没有排名,我需要再次更新整个表格。
然而,这需要太多时间。有什么优化方法或不同的方法来更快地更新表吗?也许是一种不同的方法?分区表?
字段是meta_value,当前值就像01/01/2006
我想把它改成一个字符串,20060101所以我想我可以得到这个值并按正确的顺序用字符更新它。
IE
UPDATE wp_postmeta SET meta_value = meta_value[9]meta_value[8]meta_value[7]meta_value[6]
Run Code Online (Sandbox Code Playgroud) 这是我试图在 MySQL 中找出的问题。我们有一个旧表,其中包含我们用户提交的一些表单。不知何故,之前的决定是每次用户参与此调查时,都会提交一个新表单。因此,在旧表中,我们很容易有几行具有相同的名字和姓氏,但其他列中的值不同,并且还有一个时间戳列 Date_Submission。
现在我们正在尝试将所有内容移动到一个新表中,但这一次,对于每个人,我们只保留一行。我们希望保留该用户的一些最新旧数据(如电子邮件、电话号码等)
我可以执行以下操作:
update newtable, oldtable set newtable.email = oldtable.email where newtable.firstname = oldtable.firstname and newtable.lastname = oldtable.lastname;
显然,这不会给我每个人的“最新”旧日期。
所以我尝试了这个:
update newtable, oldtable set newtable.email = oldtable.email where newtable.firstname = oldtable.firstname and newtable.lastname = oldtable.lastname 按 oldtable.Date_Submission 顺序;
但是他们 MySQL 会抱怨:
“错误 1221 (HY000):UPDATE 和 ORDER BY 的错误使用”。
所以我想知道,实现这一目标的正确方法是什么?
我有一张桌子叫做座位,它有这样的架构
身份证号
对于每个用户,我取一个随机未使用的 id 并分配给该用户,这里为简单起见,我使已使用 =1。我正在使用的查询
update seats u inner join (
SELECT id from seats
where taken is null limit 1) s
on s.id = u.id set taken = 1;
Run Code Online (Sandbox Code Playgroud)
此查询随机获取一个带有标记为空的席位,对于该席位,它使标志为 1。虽然此查询工作正常,但此线程安全吗?
考虑这种情况,我有两个并行的用户。对于 user1,我选择第 X 行,就在运行更新查询之前,user2 签入,对于该用户,select 查询返回与 user1 相同的行。所以我将结束两次更新同一行。
此查询是否可能出现这种情况?
由于 MSDN 没有说太多,如果我执行以下查询会发生什么?
update claims set status='Awaiting Auth.'
where status = 'Approved'
Run Code Online (Sandbox Code Playgroud)
我可以使用ClaimStatusName链接表的列dimClaimStatus来更新通过外键引用的主表吗?
视图本身查询多个表,主表是tabData,我也想用上面的查询更新。我想改变fiClaimStatus在tabData从FK该手段 Approved在引用表dimClaimStatus来Awaiting Auth.。它是这样工作的吗?
tabData 中的每一行只能有一个视图行。
这是视图:
CREATE VIEW [dbo].[Claims]
AS
SELECT mu.MarketUnitName AS MarketUnit,
c.CountryName AS Country,
gsp.GSPName AS GSP,
gsp.WCMSKeyNumber AS GspNumber,
sl.SLName AS SL,
sl.WCMSKeyNumber AS SlNumber,
m.ModelName AS Model,
m.SalesName AS [Model-Salesname],
s.ClaimStatusName AS [Status],
d.Work_Order AS [Work Order],
d.SSN_Number AS IMEI,
.... more columns ....
idData, -- …Run Code Online (Sandbox Code Playgroud) 哪个更快?游标循环中的多个更新查询,还是单个查询?例如,在这种情况下,哪个更快?此查询在触发器中。
循环中的多个查询
DECLARE done INT DEFAULT FALSE;
DECLARE record_id INT;
DECLARE cur CURSOR FOR SELECT id FROM table1 WHERE column = 0;
OPEN cur;
users_loop: LOOP
FETCH cur INTO id;
IF done THEN
LEAVE users_loop;
END IF;
UPDATE table2 SET column = 0 WHERE id = id;
END LOOP;
CLOSE cur;
Run Code Online (Sandbox Code Playgroud)单一查询
CREATE TEMPORARY TABLE tmp_table (id int(10));
INSERT INTO tmp_table SELECT id FROM table1 WHERE column = 0;
UPDATE table2 SET column = 0 WHERE id IN(SELECT id FROM …Run Code Online (Sandbox Code Playgroud)我正在尝试获得一个快速、简单的 sql 查询,以便在使用 join 时一次只更新一行。
我试过了LIMIT,但没有成功。
询问:
UPDATE
table1
JOIN
table2 ON table2.col=table1.col
SET
table1.row1='a value'
WHERE
table1.row2 LIKE '%something%'
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
信息:
错误代码:1221. UPDATE 和 LIMIT 的错误用法
我有一个约 3.2 亿的行表,我在上面运行以下查询:
UPDATE my_table SET state = TRIM(state)
Run Code Online (Sandbox Code Playgroud)
不用说,这已经运行了 90 多个小时(从星期四下午开始)并且还没有完成。
我想或多或少地知道它到目前为止修改了多少行。有没有办法从正在运行的事务中获取这些信息?
尝试搜索时,我发现如何使用该函数粗略估计将有多少新行添加到表中pgstattuple:
select dead_tuple_count from pgstattuple('my_table');
Run Code Online (Sandbox Code Playgroud)
但这似乎没有显示关于修改了多少行的任何有趣信息。
我有一个查询,当一个键冲突时,只有在其他列之一发生更改时才会向上插入 Postgres(以避免不必要的插入和返回的行,但实际上没有任何更改):
INSERT INTO public.test_upsert (some_id, a, b, note)
VALUES
('c', 1, true, 'asdf')
ON CONFLICT (some_id)
DO UPDATE SET
a = excluded.a,
b = excluded.b,
note = excluded.note
WHERE
test_upsert.a IS DISTINCT FROM excluded.a OR
test_upsert.b IS DISTINCT FROM excluded.b OR
test_upsert.note IS DISTINCT FROM excluded.note
RETURNING *;
Run Code Online (Sandbox Code Playgroud)
我的问题是:这个有简写吗?我基本上想在插入的任何列与现有列不同时插入新记录更新行。单独写出每一列会变得非常冗长,尽管它更明确。
update ×10
mysql ×6
postgresql ×2
delete ×1
insert ×1
join ×1
limits ×1
locking ×1
monitoring ×1
optimization ×1
oracle-10g ×1
order-by ×1
performance ×1
sql-server ×1
syntax ×1
t-sql ×1
upsert ×1
view ×1