SQL Serverの列追加ステートメントで名前付きの既定の制約を作成できますか?


163

SQL Serverでは、テーブルに新しい列があります。

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

デフォルトの制約を指定せずにNOT NULLを指定しているため、これは失敗します。テーブルにはデフォルトの制約があってはなりません。

これを回避するために、デフォルトの制約でテーブルを作成してから削除することができます。

ただし、デフォルトの制約をこのステートメントの一部として指定するように指定する方法はないようです。そのため、それを取り除く唯一の方法は、sys.default_constraintsでそれを検索するストアドプロシージャを用意することです。テーブル。

これは、頻繁に発生する可能性が高い操作の場合、少し面倒/冗長です。誰にもこれのためのより良い解決策がありますか?

回答:


224

これはうまくいくはずです:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL

1
2012年にも動作します。ゴリーの詳細:msdn.microsoft.com/en-us/library/ms187742.aspx
adam77

10
NOT NULLデータ型に隣接させてみませんか?制約の後に置くことは構文的には有効かもしれませんが、そこに置くのは紛らわしいようです。
Tullo_x86

102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)

22
NOT NULL制約が失われることを心配せずにデフォルトの制約を削除できるため、これは受け入れられた回答よりも優先されます。
EleventhDoctor

7
@EleventhDoctor意味がありません。NOT NULLは制約の一部ではなく、dropステートメントは制約名を参照するだけです
Roger Willcocks

11
@RogerWillcocksその通りですが、NOT NULLが制約から分離されていることを読むと、より明確になります。
deluxxxe

10

既存の回答はかなり薄いので、いくつかの詳細を追加したいと思います。

最も重要なヒントは次のとおりです。明示的な名前なしで制約を作成することは絶対にしないでください。

名前のない制約の最大の問題:これをさまざまなカスタマーマシンで実行すると、それぞれに異なる名前またはランダムな名前が付けられます。
任意の将来のアップグレード・スクリプトは、実際の頭痛の種になります...

一般的なアドバイスは次のとおりです。

  • 名前なしの制約はありません!
  • いくつかの命名規則を使用してください。
    • DF_TableName_ColumnName デフォルトの制約
    • CK_TableName_ColumnName チェック制約の場合
    • UQ_TableName_ColumnName 一意の制約
    • PK_TableName 主キー制約

一般的な構文は

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>

こちらをお試しください

コンマの後に列を追加するのと同じように、各列にさらに制約を追加でき、さらに制約を追加できます。

CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
 --define the primary key
 ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY

 --let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE

 --define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
                     CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)

 --add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)

 --add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO

-データを挿入します

INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) 
VALUES('fails due to uniqueness of 111,1',111,1);

1

以下のスクリプトのようにしてみてください

ALTER TABLE DEMO_TABLE
ADD Column1 INT CONSTRAINT Def_Column1 DEFAULT(3) NOT NULL,
    Column2 VARCHAR(10) CONSTRAINT Def_Column2 DEFAULT('New') NOT NULL;
GO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.