既存の列のデフォルト値を設定する方法


375

これはSQL Server 2008では機能しません。

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

エラーは:

キーワード「SET」付近の構文が正しくありません。

何が悪いのですか?


1
MSDN ALTER TABLEを読んで何と言いましたか...?msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn



1
これはmysql構文です。
Benjamin Goodacre 2018年

なぜ誰もが標準に固執できないのですか?(本当の質問ではありません、誰もがmicrosoftとmysqlまたは他のベンダーに言及しています)。これを行うためのansi / iso標準的な方法さえありますか?
joedotnot

回答:


566

これはSQL Serverで機能します。

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
+1は制約名を指定するため、SQL Serverはランダムな名前を作成しません。
HardCode、

36
MSSQLは、デフォルト値を「制約」と呼ぶのはおかしいです。どちらかと言えば、それらはリラクゼーションです。制約の反対です!彼らはより少ないものではなく、より多くのものを有効にします。
Roman Starkov 2013年

4
次のような別の方法で考えると、奇妙で​​はありません。デフォルトの制約により、列を指定しない場合、MSSQLがエラーをスローしません。したがって、これはユーザーに対する制約ではなく、MSSQLに対する制約です。
Jonny Piazzi 2014年

4
これは、列に既存のデフォルト制約がない場合にのみ機能します。
pmcilreavy

4
@fallenidol これは、列に既存のデフォルト制約がない場合にのみ機能します。そう、定義上、複数のデフォルト値を持つことはできないからです
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
これはMSSQLで機能しますが、舞台裏で作成する制約に名前を付けないという欠点があります(上記の投票数の多い回答を参照してください)。
Contango 14

10
@Contango私はあなたがそれらのうちの1つを変更する必要があるオフェンスのすべての単一の制約に名前を付けないことをお勧めします。自動的に名前が付けられた制約を削除するため手順を書くだけで、名前を付ける必要はもうありません+他のすべての名前のない制約に対処できます
JonnyRaa

3
@ジョニーリーズ。いい視点ね。また、データベーススキーマを変更(または単に理解)しようとしている人にとっては良いドキュメントであるため、制約にも名前を付けたいと思います。これは、1人のチームで作業する単独のオペレーターの場合はそれほど重要ではありません。
Contango、2015年

1
(EESH!ラインフィードの欠如について申し訳ありません-明確にするために以下に貼り付けます!)私はそれを再実行可能にする必要があり、これがすでに行われているかどうかを確認するためにこの方法を見つけました... IF EXISTS(SELECT * FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL)BEGIN ALTER TABLE [myDBO]。[myTable] ADD DEFAULT 0 FOR [myColumn] END
Dave

4
デフォルトの制約が1つしかない場合...なぜそれに名前を付ける必要があるのですか?他のデータベースエンジンは、列名以外の名前のない列のデフォルト値を追加、更新、削除するための構文を提供するように見えます。これは意味があります。上記のコードは、デフォルトがすでに存在する場合、失敗します。SQL Serverがデフォルトの制約の名前を識別するためだけにシステムテーブルに対して複雑な結合を必要とするのはばかげています。列にはデフォルトの制約が1つしかないため、これは必要ありません。
Triynko 16

51

そのために列の変更を使用できません。代わりに追加を使用してください

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
この回答が賛成票を獲得しない理由がわかりません。それは以前のものとまったく同じで、以前に回答されました...
spankmaster79

30

これを行う正しい方法は次のとおりです。

  1. 次のコマンドを実行します。

    sp_help [table name] 
  2. の名前をコピーしCONSTRAINTます。

  3. をドロップDEFAULT CONSTRAINT

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. 以下のコマンドを実行します。

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.comは英語のみです。ポルトガルのサイトはpt.stackoverflow.comです
Martin Smith

これは、他の回答に新しいものを追加しません、手動の方法である-スクリプトすることはできません、それは..「正しい方法」と述べている
アンドレ・フィゲイレド

12

Hoodaticusの解決策は完璧でした。ありがとうございましたが、再実行可能にする必要もあり、この方法でそれが実行されたかどうかを確認できました...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END

7

列のデフォルト値を変更できるシナリオは2つあります。

  1. テーブル作成時
  2. 既存のテーブルの既存の列を変更します。

  1. テーブル作成時・新規カラム作成時。

クエリ

create table table_name
(
    column_name datatype default 'any default value'
);
  1. 既存のテーブルの既存の列を変更する

この場合、SQLサーバーでは既存のデフォルトの制約値を変更できません。したがって、デフォルト値を変更するには、既存のシステム生成またはユーザー生成のデフォルト制約を削除する必要があります。その後、特定の列にデフォルト値を設定できます。

いくつかの手順に従ってください:

  1. 列の既存のデフォルト値制約をすべてリストします。

このシステムデータベースプロシージャを実行します。パラメータとしてテーブル名を取ります。テーブル内のすべての列のすべての制約のリストを返します。

execute [dbo].[sp_helpconstraint] 'table_name'
  1. 列の既存のデフォルト制約を削除します。

構文:

alter table 'table_name' drop constraint 'constraint_name'
  1. その列に新しいデフォルト値の制約を追加します。

構文:

alter table 'table_name' add default 'default_value' for 'column_name'

乾杯@ !!!


5

デフォルト名の制限がすでに存在する場合:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;


4

次の構文を使用できます。詳細については、この質問と回答を参照してください。 デフォルト値の列をSQL Serverの既存のテーブルに追加します

構文:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

例:

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

別の方法 :

テーブルを右クリックして[デザイン]をクリックし、次にデフォルト値を設定する列をクリックします。

次に、ページの下部にデフォルト値またはバインディングを追加します。文字列の場合は「1」、intの場合は1などです。


3

以前にnullであった既存の列を変更するための3つの簡単なステップが見つかりました

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 

3

最初のドロップ制約

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

2番目のデフォルト値の作成

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]


1

エラーなしでスクリプトを複数回実行できるようにするチェック付きのYuckの回答のように。(information_schema.columnsを使用するよりもコード/カスタム文字列が少ない)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.