如何在SQL Server 2005的插入语句中递增主键。

3
我需要写一个INSERT语句来插入表中的列,列看起来像这样
  • demandtypeidPK, FK, int, not null
  • characvalueidPK, FK, int, not null
  • percentageint null
  • lastuservarchar(100),null
  • lastediteddatetime,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])

你的问题中说“我只想知道如何手动插入到这个表中”,但是你的其他评论表明你没有自增列,也不能更改架构。简短的答案是,如果不更改模式以包括一个自增列,你将无法获得自增值。还有一些奇怪的技巧可用,比如在某个表中存储全局变量,但那是一个非常糟糕的主意。 - ean5533
5个回答

5

如果您需要一个唯一且自动递增的整数列,可以使用 IDENTITY 关键字:

CREATE TABLE new_employees
(
 id_num int IDENTITY(1,1),
 fname varchar (20),
 minit char(1),
 lname varchar(30)
)

在插入表格时,不要为该列插入任何内容--它会自动递增。


2

根据您发布的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')

然而,通常不会将多个列作为标识(自增)列,一般情况下,该列是唯一的主键列。


0
如果一个列是自增列(与主键列不同),则在插入语句中省略该列,它将被填充。
INSERT INTO tr_demandtypecharac (lastuser) VALUES ('Bob')

Msg 515,级别16,状态2,行1 无法将空值插入到列“demandtypeid”中,表“a7itm.dbo.tr_demandtypecharac”;该列不允许为空。插入失败。 语句已终止。 - Croeber
需求类型ID和特征值ID均设置为Identity Increment = 0:允许空值:false。 - Croeber
请发布您的表创建 To --> 脚本 - user1877337
我没有创建数据库,也没有权限更改数据。 - Croeber
我在主贴中发布了描述,谢谢。我非常感激。 - Croeber
显示剩余2条评论

0

我遇到了类似的问题,需要使用一组记录更新已购买的数据库。我的解决方案是找到目前为止使用的最高键,然后将其用作我的插入基础。核心是 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字段”表记录。


-7

6
整数是作为主键的不错选择,除非你有非常充分的理由反对使用它们。但是确实需要一个非常充分的理由。 - Oded
2
我同意Oded的观点。那篇文章篇幅短小,写作质量差,没有提供足够的细节,并得出了不公正的结论。为什么他的设计不好就意味着整数不能成为良好的主键?我可以继续说下去。 - ean5533
对不起...我不同意...我们应该摆脱这种"概念"...int类型适用于小系统,但对于真实的世界(可扩展、多租户、高使用量等)应用程序,它们会给你带来更多麻烦而不是解决问题...我并不是要表现得居高临下...但我正在面临int类型键的问题... - Leonardo
即使在使用随机整数作为键时,文章中的人也会遇到同样的问题。他仍然需要检查一个数据库的ID是否与另一个数据库的ID冲突,而不管冲突的可能性如何。 - rossisdead
1
大多数现实世界的应用程序大多数不需要那种可扩展性,也不是多租户或那种使用方式。如果你需要这样的应用程序,那么你有充分的理由不使用整数键。 - Oded

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接