LoginSignup
19
12

More than 5 years have passed since last update.

SQLServerにて、default制約付きの列を削除する

Posted at

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
19
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
12