我有一張表,其中有一列,其中一列名爲[pos]。該列包含一個數字。插入新記錄時,我希望能夠插入我的新記錄,但是[pos]比db中已經存在的最高[pos]高1。插入到表中並根據當前最高編號遞增列
Insert into table(c1,c2,pos) VALUES('c1','c2',?)
我使用的是MSSQL
我有一張表,其中有一列,其中一列名爲[pos]。該列包含一個數字。插入新記錄時,我希望能夠插入我的新記錄,但是[pos]比db中已經存在的最高[pos]高1。插入到表中並根據當前最高編號遞增列
Insert into table(c1,c2,pos) VALUES('c1','c2',?)
我使用的是MSSQL
你可以只拉Max(Pos)
並添加1
它:
Insert Table
(C1, C2, Pos)
Select 'C1', 'C2', Max(Pos) + 1
From Table
我會給你一個鏡頭! – Damien
這種技術可能會遇到[併發問題](http://stackoverflow.com/questions/8956044/avoiding-concurrency-problems-with-max1-integer-in-sql-server-2008-making-ow)? –
SQL Server可以管理這個給你。使Pos
和identity 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
我不知道爲什麼我被低估了。如果你不添加評論,我無法修復它。 –
這實際上是解決此問題的最佳方法。 downvote被誤導了。 –
我同意@GordonLinoff。唯一不構成潛在競爭條件的其他選擇是使用序列。 –
那麼,對於單行的直接的方法:
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 |
+----+----+-----+
有幾種方法可以做到這一點。但是,我們確實需要比您提供的更多信息。具體來說,(1)您可以在表中爲[pos]中的兩個條目賦予相同的值,並且(2)用戶是否可以指定新的[pos]值低於表中的現有值?爲了解決這個問題,我會假設這兩個問題的答案都是「不」。
使用的標識字段是最常見的,但根據您的具體要求,你可能需要的IDENTITY多次,這可能會造成混亂和問題的基礎復位。
SEQUENCE可以以類似的方式使用,您必須根據需要重置序列的基礎。
如果您真的必須查看錶中最大的值(特別是在可以刪除可能具有最高[pos]值的行)時顯着,那麼您可能需要在[pos]列上設置UNIQUE約束,爲每個插入或刪除使用事務,並在獲取最大值或刪除行時使用TABLOCK和ROWLOCK提示。確保你開始一個事務並且只在SQL中用ROWLOCK或TABLOCK提示讀取最高的[pos]值,只有立即添加新行,提交事務並確保釋放鎖纔是唯一的方法你似乎在問什麼。
這是**非常**有問題。您冒着兩個進程試圖在「同一時間」添加一行的風險,爲max [pos]獲得相同的值,並嘗試添加兩個具有相同pos值的不同行。可能你最好的選擇是類似於我的答案,但我仍然不喜歡這個解決方案。 –