3

次の列を持つ「Clients」というテーブルを持つ SQL Server Express Compact Edition データベースがあるとします。

ID, FirstName, MiddleName, Nickname, LastName, Suffix, IsMale

ここで、テーブルでこのコマンドを使用しようとすると、ID は自動インクリメントの主キー/ID 値です。

INSERT INTO Clients (Title, FirstName, MiddleName, Nickname, LastName, Suffix,
IsMale) VALUES ('', 'John', '', '', 'Smith', '', 'True')

すべてが機能します。しかし、このコマンドを使用しようとすると:

INSERT INTO Clients VALUES ('', 'John', '', '', 'Smith', '', 'True')

このエラーが表示されます:

The number of columns in the query and the table must match. [ Number of columns
in query = 7, Number of columns in table = 8 ]

私はかなり長い間 SQL Server で挿入ステートメントを使用してきましたが、これが問題になったことは一度もありません。列数に対する検証では、自動インクリメントの主キー/ID タイプは常に無視されていました。この場合の唯一の大きな違いは、私が現在使用している SQL Server は非常にローエンドのバージョンであるのに対して、よりプロフェッショナルなバージョンを使用することに慣れていることです。問題になる可能性がある場合に備えて、これを C# プログラムで使用しています。

これは何が原因でしょうか?ありがとう。

編集: この質問の焦点の多くは、SQL Server の非フリーで非コンパクトなバージョンを使用しているときに、この問題に遭遇したことがないという事実です。私が以前に使用した SQL Server は常に、列数の ID/主キー列を無視し、特定の列名を綴らなくても自動インクリメントされた値を把握するのに十分なほどスマートでした。

ここでのもう 1 つの違いは、以前は常に SQL Management Studio を使用してテーブル定義をいじっていたことですが、この場合は VS 2012 と SQL Server Compact Edition を使用しています。関連するユーザー インターフェイスは明らかにかなり異なるため、この問題が発生しないようにするために、Management Studio でテーブルに指定されているか、何かが指定されているのではないでしょうか?

4

4 に答える 4

3

挿入ステートメントで列を指定しない場合、すべての列が考慮されます。列の1つが自動インクリメントであっても。

挿入 - MSDN

column_list は、明示的な値が ID 列に挿入されるときに使用する必要があり、テーブルの SET IDENTITY_INSERT オプションを ON にする必要があります。

于 2013-01-11T05:38:46.993 に答える
2

INSERTINTOステートメントは2つの形式で記述できます。

最初の形式では、データが挿入される列名は指定されず、値のみが指定されます。

INSERT INTO table_name
VALUES (value1, value2, value3,...)

これは、提供された値の数が列の数と正確に一致する場合にのみ機能します

2番目の形式は、列名と挿入する値の両方を指定します。

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

これは、IDタイプのID列がある場合でも、使用する必要のあるフォームです。

ラージ


于 2013-01-11T05:43:22.657 に答える
1

Clientsテーブルに列名があることを忘れていましたTitle。最初のクエリが機能するのは、ステートメントで指定した列の値を明示的に定義しているためです。

ステートメントImplicitのタイプを使用しているため、2 つ目は失敗しました。INSERTそのタイプの を使用する場合INSERT、テーブル内のすべての列にすべての値を指定する必要があります。表の最初の列IDAuto_Increment編集NULLされているため、値を代入するために使用できます。

INSERT INTO Clients VALUES (NULL, '', 'John', '', '', 'Smith', '', 'True')
于 2013-01-11T05:40:53.663 に答える
0

「 」は、整数値に挿入できない空の文字列を表していると思います

そのため、' ' の代わりに NULL を指定できます

于 2013-01-11T06:49:30.157 に答える