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 列 'TypeID' に値 NULL を挿入できません ..... 列は許可されません。INSERT は失敗します。」ステートメントは終了します

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

列レベルとテーブル レベルの両方で制約を作成しようとしましたが、2 番目の INSERT ステートメントは入力を拒否しました。GUI を介して再確認すると、'TypeID' には確実に IDENTITY プロパティがあります。

私はいたるところを見てきましたが、このエラーは IDENTITY プロパティの欠如に起因しているようですが、作成ステートメントに存在し、エラーがまだ発生しています。IDENTITY からシードとインクリメントを削除しようとしましたが、まだ何もありません。また、一度に1行ずつデータを挿入しようとしましたが、そこにも何もありませんでした。

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から、それらTypeIdの を の新しいレコードに入力する必要がありますSPlan

ちなみに、TINYINT主キーのデータ型に使用することは完全に合法ですが、これが宿題以外の場合はおそらく本当に悪い考えです.

于 2013-06-02T14:20:18.570 に答える
1

Type1 テーブルとの外部キー関係があり、Splan テーブルの TypeID 列も NOT NULL と宣言されているため、2 番目のクエリで TypeID の値を指定する必要があります。

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 に答える