假设我有一个这样的表:
List<int> valueIds=new List<int>();
List<SomeClass> listB=new List<SomeClass>();
foreach (var x by listA.GroupBy(new {Id=x.Id, Date=x.date}))
{
var sum= g.Sum(x=>!valueIds.Contains(x.ValueId):x.Value:0)
valueIds.Add(x.ValueId)
listB.Add(new SomeClass{Id=x.Id, Value=sum)});
}
如果删除第一行,表格变为:
linq
但我希望import os
import sys
from mpi4py import MPI
import numpy as np
N = 65537
def worker():
comm = MPI.Comm.Get_parent()
size = comm.Get_size()
rank = comm.Get_rank()
buf = np.empty(N, np.byte)
comm.Recv(buf=buf)
if __name__ == '__main__':
script_file_name = os.path.basename(__file__)
if MPI.Comm.Get_parent() != MPI.COMM_NULL:
worker()
else:
comm = MPI.COMM_SELF.Spawn(sys.executable,
args=[script_file_name],
maxprocs=1)
comm.Send(np.random.randint(0, 256, N).astype(np.byte), 0)
的行有cust_id cust_name
======= ========
1 monir
2 babu
3 abir
4 bro
5 debsu
,其他记录会在我删除第一条记录时自动将cust_id cust_name
======= ========
2 babu
3 abir
4 bro
5 debsu
减少1。
这意味着新表应该像:
cust_name = 'babu'
怎么做?
答案 0 :(得分:3)
要求没有意义。更改行的主键是您应该非常努力避免的。特别是像customer_id
这样的东西也可能在多个子表中。更新表中的每一行因为删除了一行也会非常昂贵。
那就是说,如果你确定了,你可以
update customer
set customer_id = customer_id - 1
where customer_id > 1;
答案 1 :(得分:0)
我认为你对查询结果(作为开发人员)感兴趣,但不是确切的表内容(属于DBA的责任)。因此,开发人员的一个有用实践是最小化与DB表的直接交互 - 作为最简单的解决方案,您可以创建适合自定义要求的视图。
让我们修改你的例子,试图避免主键玩杂耍(正如Justin Cave所说)并放置一个标志栏,告诉我们哪些用户是活跃的。
CREATE TABLE myTable(
cust_id NUMBER(10),
cust_name VARCHAR2(1000),
is_active CHAR(1) DEFAULT 'Y'
);
CREATE VIEW myView AS
SELECT rownum AS cust_effective_id
, t.cust_name AS cust_name
, t.cust_id AS cust_real_id
-- last column just for control so you see what's happening
FROM (SELECT *
FROM myTable
WHERE is_active = 'Y'
ORDER BY cust_id) t;
让我们插入一些记录
INSERT INTO myTable (cust_id, cust_name)
SELECT 1 AS cust_id, 'monir' AS cust_name FROM dual
UNION ALL SELECT 2, 'babu' FROM dual
UNION ALL SELECT 3, 'abir' FROM dual
UNION ALL SELECT 4, 'bro' FROM dual
UNION ALL SELECT 5, 'debsu' FROM dual
现在我们可以看到他们查询myView
SELECT * FROM myView
CUST_EFFECTIVE_ID | CUST_NAME | CUST_REAL_ID
--------------------------------------------
1 | monir | 1
2 | babu | 2
3 | abir | 3
4 | bro | 4
5 | debsu | 5
现在取消删除记录,我们将其标记为非活动
UPDATE myTable SET is_active = 'N' WHERE cust_id = 1
您可能会对如何使用触发器感兴趣 docs和wise man会对您有所帮助,但在这里,我不会因为并发症而感到厌倦。
再看看我们在视图中得到的结果:
SELECT * FROM myView
CUST_EFFECTIVE_ID | CUST_NAME | CUST_REAL_ID
--------------------------------------------
1 | babu | 2
2 | abir | 3
3 | bro | 4
4 | debsu | 5
我们发现CUST_EFFECTIVE_ID
已相应更改。
注意,上面只是一个显示其中一个方向的划痕:Oracle DB为我们提供的灵活性几乎取之不尽,您可以通过多种方式自定义myView
,以及一些方法它们可以满足你的目的。