0

テーブルを作成しました:

create table userTable
(
    userId int identity(1,1) not null,
    userName nvarchar(20) not null,
    joinDate datetime not null default getdate()
        constraint pk_userTable primary key(userId) on [primary]

)

次に、列joinDateを削除しようとしました:

alter table userTable drop column joinDate

しかし、エラーが発生しました:

メッセージ 5074、レベル 16、状態 1、行 1
オブジェクト 'DF_userTable_joinD_31EC6D26' は列 'joinDate' に依存しています。
メッセージ 4922、レベル 16、状態 9、行 1
ALTER TABLE DROP COLUMN joinDate は、1 つ以上のオブジェクトがこの列にアクセスするため失敗しました。

なぜそうなのですか?

また、新しい行を挿入するときに userName 列にのみ値を指定したいのですが、それをしようとすると:

INSERT userTable SELECT 'name1';

エラーメッセージが表示されます:

メッセージ 213、レベル 16、状態 1、行 1
列名または指定された値の数がテーブル定義と一致しません。

このエラーが発生するのはなぜですか?

4

1 に答える 1

3

列を削除する場合は、まず制約を削除する必要があります。わざわざ制約に名前を付けなかったので、それを見つける必要があります (たとえば、受け取ったエラー メッセージで気付かなかった場合)。

DECLARE @sql NVARCHAR(4000);

SELECT @sql = 'ALTER TABLE userTable DROP CONSTRAINT ' + QUOTENAME(dc.name) + ';'
  FROM sys.default_constraints AS dc
  INNER JOIN sys.columns AS c
  ON dc.parent_object_id = c.[object_id]
  AND dc.parent_column_id = c.column_id
  WHERE parent_object_id = OBJECT_ID('dbo.userTable')
  AND c.name = 'joinDate';

PRINT @sql;
-- EXEC sp_executesql @sql;
-- ALTER TABLE userTable DROP COLUMN joinDate;

編集

列の値をハードコーディングせずにこのテーブルに挿入したい場合は、次のjoinDateように言うことはできません。

INSERT userTable SELECT 'name1';

列リストがテーブル定義と一致しないなどのエラーが表示されます。したがって、列のサブセットに挿入する場合は、それらの列に名前を付ける必要があります。

INSERT userTable(userName) SELECT 'name1';

怠惰で列リストを除外することは列に対して機能しIDENTITYますが、これはルールではなく例外です(誤解を招くため、許可されるべきではないと思います)。

于 2012-05-16T13:58:58.440 に答える