即使Column具有IDENTITY属性,也无法将值NULL插入列'id'

时间:2013-06-02 14:14:23

标签: sql sql-server-2008

CREATE TABLE Type1
(
   TypeID       TINYINT         NOT NULL            IDENTITY(1,1),
   TypeName     VARCHAR(20)     NOT NULL,
   Speed        VARCHAR(10)     NOT NULL

   CONSTRAINT   TypeID_pk       PRIMARY KEY (TypeID)
);


   CREATE TABLE Splan
(
   PlanID       TINYINT         NOT NULL            IDENTITY(1,1),
   TypeID       TINYINT         NOT NULL,
   PlanName     VARCHAR(20)     NOT NULL,
   Quota        SMALLINT        NOT NULL

   CONSTRAINT   PlanID_pk       PRIMARY KEY (PlanID)
   CONSTRAINT   TypeID_fk       FOREIGN KEY (TypeID) REFERENCES Type1(TypeID)                                    
);  



  INSERT INTO Type1(TypeName, Speed)
  VALUES ('Sample type', '10Mbps'),
         ('Other type', '50Mbps');

^直到那里很好

然后当我输入以下内容时,它返回“Msg 515,Level 16,State 2,Line 8” 无法将值NULL插入列'TypeID'.....列不允许。 INSERT失败。“语句终止

   INSERT INTO Splan(PlanName, Quota)
   VALUES ('Some sample name', '500GB'),
          ('sample2, '250GB');

我已尝试在列级和表级创建约束,但第二个INSERT语句仍拒绝输入。通过GUI双重检查,'TypeID'肯定有IDENTITY属性。

我到处都看过,这个错误似乎源于缺少IDENTITY属性,但它在我的创建语句中出现并且错误仍然出现。尝试去除种子并从IDENTITY增加,仍然没有。还尝试一次插入一行数据,也没有。

P.S如果您没有注意到实际名称已被替换,而其他列已被省略。

2 个答案:

答案 0 :(得分:5)

由于您将typID创建为NOT NULL,因此Sql抱怨默认值(NULL)不可接受。

尝试

INSERT INTO Splan(TypeID, PlanName, Quota)
VALUES (1, 'Some sample name', '500GB'),
       (2, 'sample2, '250GB');

TypeID = 1和TypeID = 2的相应记录在Type1表中。


您正在创建2个表:Type1,其中包含自动生成的主键TypeIdSPlan,其主键PlanId也是自动生成的 外键 TypeId必须提供且不能空

如上所述,您必须首先在Type1中输入一条或多条记录,获取TypeId,然后将这些TypeId输入SPlan中的新记录。

顺便说一句,使用TINYINT作为主键数据类型是完全合法的,但如果这不是家庭作业,那可能是个坏主意。

答案 1 :(得分:1)

您需要在第二个查询中为TypeID提供值,因为您与Type1表具有外键关系,并且因为Splan表中的TypeID列也被声明为NOT NULL。

INSERT INTO Splan(TypeID, PlanName, Quota)
   VALUES (1, 'Some sample name', '500GB'),
          (2, 'sample2, '250GB');

尝试使用SCOPE_IDENTITY

在事务中插入两个记录
begin tran

INSERT INTO Type1(TypeName, Speed)
  VALUES ('Sample type', '10Mbps')

DECLARE @id INT = SCOPE_IDENTITY();

INSERT INTO Splan(TypeID, PlanName, Quota)
       VALUES (@id, 'Some sample name', '500GB')

commit