[英]How to increment a primary key in an insert statement in SQL Server 2005
我需要在表中寫入一個insert
語句,列看起來像這樣
demandtypeid
( PK, FK, int, not null
)characvalueid
( PK, FK, int, not null
)percentage
( int null
)lastuser
( varchar(100), null
)lastedited
( datetime, null
) 這是INSERT
語句。 請注意,沒有值
value( , , 'Bob')
因為我認為那是自動增量命令應該去的地方
insert into tr_demandtypecharac(demandtypeID, characvalueid, lastuser)
values( , , 'Bob')
請幫助一個簡單的小聲明
我只想知道如何手動插入到這個表中
這是我的表結構:
CREATE TABLE [dbo].[tr_demandtypecharac](
[demandtypeid] [int] NOT NULL,
[characvalueid] [int] NOT NULL,
[percentage] [int] NULL,
[lastuser] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[lastedited] [datetime] NULL,
CONSTRAINT [PK_tr_dtc_pkey] PRIMARY KEY CLUSTERED
(
[demandtypeid] ASC,
[characvalueid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[tr_demandtypecharac] WITH CHECK
ADD CONSTRAINT [FK_tr_dtc_cvid]
FOREIGN KEY([characvalueid]) REFERENCES [dbo].[tr_characvalue] ([characvalueid])
ALTER TABLE [dbo].[tr_demandtypecharac] WITH CHECK
ADD CONSTRAINT [FK_tr_dtc_dtid]
FOREIGN KEY([demandtypeid]) REFERENCES [dbo].[tr_demandtype] ([demandtypeid])
如果您想要一個唯一且自動遞增的 int 列,請使用IDENTITY
關鍵字:
CREATE TABLE new_employees
(
id_num int IDENTITY(1,1),
fname varchar (20),
minit char(1),
lname varchar(30)
)
然后,當您插入表中時,不要為該列插入任何內容——它會自動遞增。
鑒於您發布的CREATE TABLE
語句,沒有自動遞增(又名身份)列,您將插入提供所有列和值,如下所示:
insert into tr_demandtypecharac(
demandtypeid, characvalueid,
percentage, lastuser, lastedited)
values(2, 3, 80, 'Bob', '01/01/2012')
但是,如果您確實通過將CREATE TABLE
更改為以下內容來使它們自動遞增:
CREATE TABLE [dbo].[tr_demandtypecharac](
[demandtypeid] [int] NOT NULL IDENTITY(1,1),
[characvalueid] [int] NOT NULL IDENTITY(1,1),
[percentage] [int] NULL,
[lastuser] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[lastedited] [datetime] NULL,
CONSTRAINT [PK_tr_dtc_pkey] PRIMARY KEY CLUSTERED
(
[demandtypeid] ASC,
[characvalueid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
)
然后您將插入提供所有非身份(非自動增量)列,如下所示:
insert into tr_demandtypecharac(
percentage, lastuser,
lastedited)
values(80, 'Bob', '01/01/2012')
但是,具有多個列作為標識(自增)列的情況並不常見,而且通常,該列是唯一的 PRIMARY KEY 列。
如果列是自動增強列(不同於主鍵列),那么您在插入語句中省略該列,它將被填充。
INSERT INTO tr_demandtypecharac (lastuser) VALUES ('Bob')
我有一個類似的問題,需要用一組記錄更新購買的數據庫。 我的解決方案是找到到目前為止使用的最高鍵,然后將其用作插入的基礎。 它的核心是 ROWNUMBER() OVER(ORDER BY PART_CODE)。
關鍵是 inadjinf 表中的“recnum”字段。 我確定當前最高密鑰是 675400 並將我的查詢更新為:
insert into inadjinf (recnum, user_id, adj_type, adj_status, trans_date, part_code, lotqty, uom, cost_ctr, lot, location, to_cost_ctr, to_location, rec_status, to_part_grade, to_rec_status, remarks1, uom_conv)
select ROW_NUMBER() OVER(ORDER BY INVDET.PART_CODE) + 675400 as recnum, 'CHRSTR' as user_id, 'M' as adj_type, 'O' as adj_status, '2020-10-23' as trans_date, invdet.part_code, sum(lotqty) as lotqty, uom,
cost_ctr, lot, location, 'NS' as to_cost_ctr, '500A' as to_location, rec_status, 'Q' as to_part_grade, 'H' as to_rec_status, 'NS Scrap Request from MSobers 10/21/2020' as remarks1, '1' as uom_conv
from invdet
inner join partmstr on invdet.part_code = partmstr.part_code
where
invdet.part_code In
(
'86038',
'1271',
'VM-0021',
'CO-0107',
...
'FO-0391',
'FO-0376'
)
and lot not in (select lot from inadjinf where trans_date = '2020-10-23' and user_id = 'CHRSTR')
group by invdet.part_code, uom, cost_ctr, lot, location, rec_status
我的輸出從 675401 開始,然后從那里上升。 最后,我更新了系統內部的“下一個id字段”表記錄。
你不應該使用 int 作為主鍵......這是一篇關於它的文章:http: //techtrainedmonkey.com/2012/07/30/why-integers-are-lousy-primary-keys/
但如果你這樣做......將字段設置為身份,Sql Server 會為你做......檢查一下:http: //msdn.microsoft.com/en-us/library/ms186775.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.