【问题标题】:Why isn't my Auto Increment working in SQL Server 2008?为什么我的自动增量在 SQL Server 2008 中不起作用?
【发布时间】:2014-07-09 01:50:15
【问题描述】:

这是我的表创建:

create table Movie 
(
     MovieID int NOT NULL IDENTITY (1,1) PRIMARY KEY, 
     MovieName varchar(40) NOT NULL UNIQUE, 
     CurrentStock int NOT NULL, 
     GenreID int NOT NULL,
     RatingID int NOT NULL, 
     Max_Inventory int NOT NULL, 
     Platforms char(5) NOT NULL, 
     Discontinued bit, 
     DiscontinuedDate Date
); 

create table Inventory
(
     InventoryID int NOT NULL IDENTITY (1,1) PRIMARY KEY, 
     MovieID int Not NULL,
     CurrentStock int NOT NULL, 
     Max_Inventory int NOT NULL
);

存储过程:

ALTER PROCEDURE [dbo].[InsInventory]
(@CurrentStock int,
 @ChangeStock int)
as
begin
  insert into Inventory(Max_Inventory, CurrentStock)
  Values (@ChangeStock, @CurrentStock)

  select SCOPE_IDENTITY();
END

ALTER PROCEDURE [dbo].[InsMovie] 
(@GenreID int,
 @RatingID int,
 @Platform varchar(5),
 @MovieName varchar(40)
)
AS
BEGIN
   Insert into Movie (RatingID, MovieName, Platforms, GenreID)
   Values (@RatingID, @MovieName, @Platform, @GenreID)

   select SCOPE_IDENTITY();

   SET NOCOUNT ON;
END

外键:

ALTER Table Inventory
ADD CONSTRAINT fk_Inventory_Movie 
FOREIGN KEY (MovieID) REFERENCES Movie(MovieID)

ALTER TABLE Movie
ADD CONSTRAINT fk_Movie_RatingLookUp
FOREIGN KEY (RatingID) REFERENCES RatingLookUp(RatingID)

ALTER TABLE Movie
ADD CONSTRAINT fk_Movie_GenreLookUp
FOREIGN KEY (GenreID) REFERENCES GenreLookUp (GenreID)

当我运行我的代码时,我在 Visual Studio 中不断收到错误

MovieID 不能为空

但它应该是当我插入一行时。我还确保手动检查 SQL Server 是否设置了IsIdentity,确实如此。所以请帮助一个困惑的程序员。

【问题讨论】:

  • 能否提供您的 INSERT 声明?
  • 嗯,它在抱怨 MovieID?您没有设置 currentstock 或 max_inventory 两者都创建为NOT NULL
  • 请编辑您的原始问题以添加额外的详细信息,而不是将它们放入 cmets
  • 让我猜您在 Inventory 表中插入值时遇到“MovieID 不能为空”错误?
  • 是的,我可能刚刚想通了,但必须快速调试

标签: sql database sql-server-2008 datatable


【解决方案1】:

您不应该插入NULL 作为主键以使其生成值,您根本不应该插入该值,而不是将其列在要插入的字段中。作为样本;

INSERT INTO Movie (moviename, currentstock, genreid, ratingid, max_inventory, platforms)
                  VALUES ('name1', 1, 1, 1, 1, '1');

A simple working sample with your exact table creation.

【讨论】:

  • 这就是我的评论所要表达的; OP 没有提供 INSERT 语句,但如果他提供了,我假设他明确将 MovieID 设置为 NULL。
【解决方案2】:

以下陈述是您的问题。您的表 def 显示 MovieID 不为空。但在下面的声明中你没有提供。

insert into Inventory(Max_Inventory, CurrentStock)
Values (@ChangeStock, @CurrentStock)

这是您需要做的。首先您需要检索将在执行 InsMovie sproc 时返回的电影 ID。而不是您需要将该电影 ID 用作 InsInvetory sproc 调用的参数。

根据您的表格定义电影 id 是必需的。同样对于电影表,您错过了我添加的两列值,这也是必需的。

请查看更新的存储过程。

ALTER PROCEDURE [dbo].[InsInventory]
(

@CurrentStock int,
@ChangeStock int,
@MovieID int
)

as
begin
insert into Inventory(MovieID, Max_Inventory,CurrentStock)
    Values (@MovieID, @ChangeStock, @CurrentStock)

select SCOPE_IDENTITY();
END

ALTER PROCEDURE [dbo].[InsMovie] 
(
@GenreID int,
@RatingID int,
@Platform varchar(5),
@MovieName varchar(40),
@CurrentStock int, 
@max_inventory int
)
AS
BEGIN

Insert into Movie (CurrentStock, max_inventory, RatingID, MovieName, Platforms,GenreID)
    Values(@CurrentStock, @max_inventory, @RatingID,@MovieName, @Platform, @GenreID)

select SCOPE_IDENTITY();

SET NOCOUNT ON;


END

【讨论】:

  • 呃... MovieID 是一个标识列,它会生成自己的值,并且可能在某些 RDBMS 的偶数对象中被设置。
  • 是的。 MovieID 是一个标识列,将由此语句返回 select SCOPE_IDENTITY();当你执行 InsMovie sproc 时。我告诉他使用该电影 ID 并将其作为参数传递给 InsInventory 存储过程调用。
猜你喜欢
  • 2021-10-13
  • 2017-07-28
  • 2012-01-08
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多