web-dev-qa-db-ja.com

SQL Server、主キーフィールドにnullを挿入できませんか?

これで髪の毛を抜く準備ができました。私はMS SQLにかなり慣れていないので、どこにも同じような投稿はありません。

次のようなステートメントを実行しようとすると、

INSERT INTO qcRawMatTestCharacteristic 
VALUES(NULL, 1,1,1,1,1,1,1,'','','', GETDATE(), 1)

私は以下を得ます:

列 'iRawMatTestCharacteristicId'、テーブル 'Intranet.dbo.qcRawMatTestCharacteristic'に値NULLを挿入できません。列はnullを許可しません。 INSERTは失敗します。

エラーを理解しましたが、null値は、intデータ型の私のプライマリフィールド用です。

何か案は!?

19
Nick

anyリレーショナルデータベースの主キーは、NULLにすることはできません。これは、主キーの主要な基本特性の1つです。

参照: SQL by Design:主キーの選択方法

Never Null
主キーの値をnullにすることはできません。また、主キーをnullにするために何もすることはできません。 これは、ANSI、リレーショナルデータベース管理システム(RDBMS)設計、およびSQL Serverでサポートされているリレーショナルモデルの違反ルールです。

UPDATE:わかりました。SQLServerで「自動インクリメント」主キーが必要になります。

CREATE TABLEステートメントでINT IDENTITYとして定義する必要があります。

 CREATE TABLE dbo.YourTable(ID INT IDENTITY, col1 INT, ..., colN INT)

次に、INSERTを実行するときは、挿入する列を明示的に指定する必要がありますが、そのリストで「ID」列を指定しないでください。SQLServerが適切な値の検索を自動的に処理します。

 INSERT INTO dbo.YourTable(col1, col2, ..., colN) -- anything **except** `ID`      
 VALUES(va1l, val2, ..., valN)

既にテーブルを作成した後でこれを行う場合は、SQL Server Management Studioのテーブルデザイナーで行うことができます。

alt text

50
marc_s

MS SQLでは、主キーフィールドにnull値を含めることはできません。 SQLテーブルにデータを入力し、整数ベースの主キーフィールドに何を入力するかわからない場合は、pkをIdentityフィールドに設定します。また、Insertステートメントを指定するときは、次のように、Insertステートメントの列マッピング部分を使用するのが賢明です。

Insert into (field1, field2, field3)
values
(value1, value2, value3)

これは、SQL管理者が列の順序を変更できるように、列の順序が開発したものであることを保証するためです。また、主キーの例の値を指定せずに、ID主キーを持つ行を挿入することもできます。

CREATE TABLE [dbo].[foo](
    [fooid] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NULL,
 CONSTRAINT [PK_foo] PRIMARY KEY
(
        [fooid] ASC
)

今私の挿入ステートメントは簡単です

Insert into foo (name)
values
("John")

テーブルの結果は

1, "John"
8
John Hartsock

おそらく整数の主キーに自動インクリメントが設定されていません(追加するのを忘れていました)。

4
Alin Purcaru

主キーはnull値を受け入れてはなりません。null値を主キーフィールドに挿入する理由は?

3
Shyju

1つの一意の行にのみnullの代わりに0を使用できます。PKではnullは使用できません。または、PKを省略して、自動increent PKフィールドを使用することもできます

2
sirmak

プライマリキーの自動インクリメントフィールドがあると仮定すると、挿入にフィールドリストを含め、そのフィールドに値を設定しないようにする必要があります。

INSERT INTO qcRawMatTestCharacteristic 
(Answer1,Answer2,...SomeDateField)
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1)
2
Conrad Frix

私はあなたの本当の問題は、PKが正しく自動入力されるように挿入文を書く方法がわからないことだと思いますか?値を設定するフィールドに名前を付ける必要があります。すべてのフィールドを設定しようとしているように見えますが、PKフィールドは次のように除外しています。

INSERT INTO someTable
(fieldName1, fieldName2) 
VALUES(1,1)

Sometableは3つのフィールドを持つテーブルです。 PK、fieldName1、およびfieldName2。また、PKフィールドのIDプロパティがtrueに設定されていることを確認する必要があります。

2
Spencer Ruport

iD列がある場合は、insertステートメントで指定する必要はありません。

INSERT INTO qcRawMatTestCharacteristic  
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1) 

ただし、ID列ではない主キーがある場合は、それを指定する必要があります。それ以外の場合は、NULLを挿入しようとし、デフォルトで主キーはNULL不可です。

0
DForck42