193

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

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

デフォルトの制約を指定せずにNOTNULLを指定したため、これは失敗します。テーブルにデフォルトの制約を設定しないでください。

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

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

これは、頻繁に発生する可能性のある操作にとっては少し厄介/冗長です。誰かがこれに対するより良い解決策を持っていますか?

4

5 に答える 5

273

これは機能するはずです:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL
于 2010-09-22T14:06:30.330 に答える
126
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)
于 2010-09-22T14:06:32.807 に答える
31

詳細を追加したいと思います。

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

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

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

  • 名前のない制約はありません!
  • いくつかの命名規則を使用します。
    • 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);
于 2019-12-16T08:14:49.757 に答える
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
于 2020-01-18T11:26:25.977 に答える
0

新しい列とデフォルトを大きなテーブルに追加するときは、次を使用します。各行を個別に実行します。

ALTER TABLE dbo.[TableName] ADD [ColumnName] BIT NULL; /*null>no table rebuild*/

UPDATE rf SET rf.[ColumnName] = 0 FROM dbo.[TableName] rf WHERE rf.[ColumnName] IS NULL;

ALTER TABLE dbo.[TableName] ALTER COLUMN [ColumnName] BIT NOT NULL;

ALTER TABLE dbo.[TableName] ADD CONSTRAINT DF_[TableName]_[ColumnName] DEFAULT 0 FOR [ColumnName];
于 2021-11-07T19:59:06.967 に答える