web-dev-qa-db-ja.com

列のデフォルト値を変更する

this のような既存の列のデフォルト値を変更できることを知っています。

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

しかし、 this によると、私のクエリは動作するはずです:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL 
      CONSTRAINT DF_Constraint DEFAULT GetDate()

したがって、ここでは、列を非ヌルにし、デフォルト値を設定しようとしています。しかし、CONSTRAINTの近くでIncoorect構文エラーが発生します。 sthがありませんか?

20
SZT

ここでの問題は、Create TableコマンドとAlter Tableコマンドの混乱にあると思います。 Create tableを見ると、デフォルト値とデフォルト制約を同時に追加できます:

<column_definition> ::= 
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ] 
    [ SPARSE ]
    [ NULL | NOT NULL ]
    [ 
        [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
      | [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ] 
    ]
    [ ROWGUIDCOL ]
    [ <column_constraint> [ ...n ] ] 
    [ <column_index> ]
 ex: 
CREATE TABLE dbo.Employee 
(
     CreateDate datetime NOT NULL 
     CONSTRAINT DF_Constraint DEFAULT (getdate())
) 
ON PRIMARY;

ここで完全な定義を確認できます: http://msdn.Microsoft.com/en-IN/library/ms174979.aspx

しかし、Alter Tableの定義を見ると、ALTER TABLE ALTER COLUMNCONSTRAINTを追加することはできませんADDで使用できるオプションは次のとおりです。

 | ADD 
    { 
        <column_definition>
      | <computed_column_definition>
      | <table_constraint> 
      | <column_set_definition> 
    } [ ,...n ]

ここで確認してください: http://msdn.Microsoft.com/en-in/library/ms190273.aspx

したがって、列を変更するための2つの異なるステートメントを次のように記述する必要があります。

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;

およびテーブルを変更し、デフォルトの制約を追加するための別の

ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;

お役に立てれば!!!

10
Deepshikha

SQLサーバーの列のデフォルト値を直接変更する方法はありませんが、次のパラメーター化されたスクリプトが機能します。

DECLARE @table nvarchar(100)
DECLARE @column nvarchar(100)
DECLARE @newDefault nvarchar(100)
SET @table='TableName'
SET @column='ColumnName'
SET @newDefault='0'

IF EXISTS (select name from sys.default_constraints 
    where parent_object_id = object_id(@table) 
    and parent_column_id = columnproperty(object_id(@table), @column, 'ColumnId'))
BEGIN
    DECLARE @constraintName as nvarchar(200)
    DECLARE @constraintQuery as nvarchar(2000)

    SELECT @constraintName = name from sys.default_constraints 
        where parent_object_id = object_id(@table) and parent_column_id = columnproperty(object_id(@table),@column, 'ColumnId')

    SET @constraintQuery = 'ALTER TABLE '+@table+' DROP CONSTRAINT '+@constraintName +'; ALTER TABLE '+ @table 
        + ' ADD CONSTRAINT ' + @constraintName +' DEFAULT '+@newDefault+' FOR '+@column 

    EXECUTE sp_executesql @constraintQuery  
END 

パラメータを入力して実行するだけです。スクリプトは既存の制約を削除し、指定されたデフォルト値で新しい制約を作成します。

5
Plamen Kasabov

既存の列を変更するには、以下を行う必要があります。

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
4
Alex K.

そのはず -

ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;

ALTER TABLE MyTable 
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
2
Krishnraj Rana

MSDNから ALTER TABLE の例:

D。既存の列にDEFAULT制約を追加する

次の例では、2つの列を持つテーブルを作成し、最初の列に値を挿入します。他の列は[〜#〜] null [〜#〜]のままです。 [〜#〜] default [〜#〜]制約が2番目の列に追加されます。デフォルトが適用されていることを確認するために、別の値が最初の列に挿入され、テーブルが照会されます。

CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO

つまり、要するに、ADD CONSTRAINT

ALTER TABLE MyTable 
    ALTER COLUMN CreateDate DATETIME NOT NULL ;

ALTER TABLE MyTable
    ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
1