【SQL Server】デフォルト制約が設定されている列を削除する

デフォルト制約が設定されている列は、
そのままでは削除できません!

列を削除する前に
 ・列に設定されているデフォルト制約を削除
する必要があります!

PR

デフォルト制約が設定されている列の削除を試みると…

例えば
 ・デフォルト制約が設定されているテーブル「m_product」の
 ・列「price」の削除を試みるとエラーが発生
します。

テーブル作成時に列「price」にデフォルト制約を設定
テーブル作成時に列「price」にデフォルト制約を設定
デフォルト制約が設定されている列の削除を試みるとエラー発生
デフォルト制約が設定されている列の削除を試みるとエラー発生
エラーメッセージ

メッセージ 5074、レベル 16、状態 1、行 3
オブジェクト ‘DF__m_product__price__2EA5EC27’ は 列 ‘price’ に依存しています。
メッセージ 4922、レベル 16、状態 9、行 3
ALTER TABLE DROP COLUMN price は失敗しました。1 つ以上のオブジェクトがこの 列 を参照しています。


デフォルト制約が設定されている列を削除する前に
 ・列に設定されているデフォルト制約を削除
する必要があります。

PR

列に設定されているデフォルト制約を削除する

デフォルト制約名は、SSMSの「オブジェクトエクスプローラー」で確認できます。

例えば
 ・テーブル「m_product」の列「price」に設定されている
 ・デフォルト制約名は「DF__m_product__price__318258D2
であることが分かります。

デフォルト制約の名前
デフォルト制約の名前

以下のSQLでもデフォルト制約名を取得できます。


DECLARE
	@tableName VARCHAR(30),
	@columnName VARCHAR(30),
	@tableId VARCHAR(10),
	@columnId VARCHAR(10)

--対象テーブルを指定
SET @tableName = 'm_product'
--対象列を指定
SET @columnName = 'price'

--対象テーブルの「テーブルID」を取得
SET @tableId = (SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = @tableName)

--対象テーブルの「列ID」を取得
SET @columnId = (SELECT column_id FROM sys.columns WHERE object_id = @tableId AND name = @columnName)

--「テーブルID」と「列ID」を使用して、「デフォルト制約名」を取得
SELECT
	name AS 'デフォルト制約名'
FROM 
	sys.sysobjects 
WHERE id = (SELECT constid FROM sys.sysconstraints WHERE id = @tableId AND colid = @columnId)

以下は状況に応じて変更してください。
・対象テーブルを指定(9行目)
・対象列を指定(11行目)


取得したデフォルト制約名を使用して、デフォルト制約を削除します。

デフォルト制約の削除の構文

ALTER TABLE テーブル名 DROP CONSTRAINT デフォルト制約の名前

--デフォルト制約を削除
ALTER TABLE m_product DROP CONSTRAINT DF__m_product__price__318258D2


上記のSQLを実行すると、デフォルト制約が削除されたことを確認できます。

デフォルト制約が削除された
デフォルト制約が削除された
PR

列を削除する

デフォルト制約が無くなったため、通常の方法で列を削除できます。

--列の削除
ALTER TABLE m_product DROP COLUMN price


上記のSQLを実行すると、列が削除されたことを確認できます。

列の削除
列の削除
PR

参考

列を削除する方法の詳細については、以下の記事をご確認ください。

タイトルとURLをコピーしました