0
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');

^直到那里都很好

然后当我输入以下内容时,它返回“消息 515,级别 16,状态 2,第 8 行无法将值 NULL 插入列‘TypeID’.....列不允许。插入失败。” 语句终止

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

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

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

PS 如果您没有注意到实际名称已被替换并且其他列行已被省略。

4

2 回答 2

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 具有TypeId自动生成的主键和自动生成的SPlan主键以及必须提供且不能为 null外键TypeId 。PlanId

如所写,您必须先输入 1 条或多条记录Type1,获取它们TypeId的 s,然后将这些TypeIds 输入到 中的新记录中SPlan

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

于 2013-06-02T14:20:18.570 回答
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
于 2013-06-02T14:21:04.020 回答