SQLServerでは、default制約付きの列を削除できない
ALTER TABLE (Transact-SQL)に下記の記述があります。
次の条件に該当する列は削除できません。
・インデックスで使用されている列
・CHECK、FOREIGN KEY、UNIQUE、または PRIMARY KEY 制約で使用されている列
・DEFAULT キーワードで定義された既定値に関連付けられている列、または既定値のオブジェクトにバインドしている列
・ルールにバインドしている列
したがって、下記のようにDEFAULT値が設定された列については、列を削除する前に、DEFAULT制約を削除する必要があります。
ALTER TABLE <table_name> ADD <column_name> <data_type> NOT NULL DEFAULT <default_value>;
DEFAULT制約がある列を削除しようとすると、下記のようなエラーが発生します。
The object '<default constraint name>' is dependent on column '<column_name>'. 2) [Code: 4922, SQL State: S1000] ALTER TABLE DROP COLUMN <column_name> failed because one or more objects access this column.
DEFAULT制約を削除
DEFAULT制約の名称は下記のSQLにて取得することができます。
SELECT obj.name FROM sys.objects AS obj
JOIN sys.columns AS clm ON obj.object_id = clm.default_object_id
WHERE obj.type = 'D' AND obj.parent_object_id = OBJECT_ID('<table_name>') AND clm.name = '<column_name>'
DEFAULT値制約は下記のSQLで削除することができます。
ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;
DEFAULT制約付きの列を削除するSQL
との2つの変数により、DEFAULT値制約付きの列を削除することが可能です。
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = obj.name FROM sys.objects AS obj
JOIN sys.columns AS clm ON obj.object_id = clm.default_object_id
WHERE obj.type = 'D' AND obj.parent_object_id = OBJECT_ID('<table_name>') AND clm.name = '<column_name>'
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE <table_name> DROP CONSTRAINT ' + @ConstraintName)
GO
ALTER TABLE <table_name> DROP COLUMN <column_name>;
GO