2017-04-07 26 views
-1

我有一張表,其中有一列,其中一列名爲[pos]。該列包含一個數字。插入新記錄時,我希望能夠插入我的新記錄,但是[pos]比db中已經存在的最高[pos]高1。插入到表中並根據當前最高編號遞增列

Insert into table(c1,c2,pos) VALUES('c1','c2',?) 

我使用的是MSSQL

+0

這是**非常**有問題。您冒着兩個進程試圖在「同一時間」添加一行的風險,爲max [pos]獲得相同的值,並嘗試添加兩個具有相同pos值的不同行。可能你最好的選擇是類似於我的答案,但我仍然不喜歡這個解決方案。 –

回答

1

你可以只拉Max(Pos)並添加1它:

Insert Table 
     (C1, C2, Pos) 
Select 'C1', 'C2', Max(Pos) + 1 
From Table 
+0

我會給你一個鏡頭! – Damien

+1

這種技術可能會遇到[併發問題](http://stackoverflow.com/questions/8956044/avoiding-concurrency-problems-with-max1-integer-in-sql-server-2008-making-ow)? –

1

SQL Server可以管理這個給你。使Posidentity column

-- Creating a identity column. 
DECLARE @Table TABLE 
(
    C1 VARCHAR(2), 
    C2 VARCHAR(2), 
    Pos INT IDENTITY (1, 1) 
); 

-- Populating the table. 
-- NOTE: SQL Server takes care of Pos for you. 
INSERT INTO @Table 
(
    C1, 
    C2 
) 
VALUES 
    ('C1', 'C2'), 
    ('C3', 'C4') 
; 

返回

C1 C2 Pos 
C1 C2 1 
C3 C4 2 
+0

我不知道爲什麼我被低估了。如果你不添加評論,我無法修復它。 –

+1

這實際上是解決此問題的最佳方法。 downvote被誤導了。 –

+0

我同意@GordonLinoff。唯一不構成潛在競爭條件的其他選擇是使用序列。 –

1

那麼,對於單行的直接的方法:

insert into table(c1,c2,pos) 
select 'c1','c2',1+isnull((select max(pos) from table),0) 

超過一組值,你可以做這樣的事情:

create table t (c1 char(2), c2 char(2), pos int); 

insert into t (c1,c2,pos) 
select v.c1,v.c2,row_number() over (order by (select 1))+x.MaxPos 
from (values ('c1','c2'),('d1','d2'),('e1','e2')) v (c1,c2) 
cross join (
    select MaxPos = isnull(max(pos),0) 
    from t 
) x; 

select * from t; 

rextester演示:http://rextester.com/DVJB25196

回報:

+----+----+-----+ 
| c1 | c2 | pos | 
+----+----+-----+ 
| c1 | c2 | 1 | 
| d1 | d2 | 2 | 
| e1 | e2 | 3 | 
+----+----+-----+ 
0

有幾種方法可以做到這一點。但是,我們確實需要比您提供的更多信息。具體來說,(1)您可以在表中爲[pos]中的兩個條目賦予相同的值,並且(2)用戶是否可以指定新的[pos]值低於表中的現有值?爲了解決這個問題,我會假設這兩個問題的答案都是「不」。

使用的標識字段是最常見的,但根據您的具體要求,你可能需要的IDENTITY多次,這可能會造成混亂和問題的基礎復位。

SEQUENCE可以以類似的方式使用,您必須根據需要重置序列的基礎。

如果您真的必須查看錶中最大的值(特別是在可以刪除可能具有最高[pos]值的行)時顯着,那麼您可能需要在[pos]列上設置UNIQUE約束,爲每個插入或刪除使用事務,並在獲取最大值或刪除行時使用TABLOCK和ROWLOCK提示。確保你開始一個事務並且只在SQL中用ROWLOCK或TABLOCK提示讀取最高的[pos]值,只有立即添加新行,提交事務並確保釋放鎖纔是唯一的方法你似乎在問什麼。