1

各テーブルの制約には、省略形、準省略形、および完全な形式があることがわかります (命名についてはご容赦ください。それらを正しく呼び出す方法の提案を歓迎します)。

例えば

省略形: 制約名は SQL Server によって定義されます。影響を受ける列は、定義されている列として暗示されます。

CREATE TABLE myTable
(
    id int PRIMARY KEY,
)

準省略形: 明示的な制約名、暗黙の列

id int CONSTRAINT PK_ID PRIMARY KEY,

完全な形式 : どちらも明示的です。列の定義とは別に、最後に定義を許可する

id int,
Name varchar(40),
CONSTRAINT PK_ID PRIMARY KEY(id)

私が見たALTER TABLEところ、完全な形式は でよく見られ、制約は後で定義されます。

DEFAULT拘束用

省略形

id int DEFAULT newid()

半省略形

id int CONSTRAINT DF_ID DEFAULT newid()

ALTER TABLEas hereでフルフォームの使用が見られます

ALTER TABLE [dbo].[Customers] WITH NOCHECK ADD 
  CONSTRAINT [DF__Customers__cust___151B244E] 
  DEFAULT ('new customer') FOR [cust_name],
  CONSTRAINT [def_last_updated_by] DEFAULT 
  (suser_sname()) FOR [last_updated_by],
  PRIMARY KEY  CLUSTERED 
  ([cust_id])  ON [PRIMARY] 
GO

ただし、テーブル作成時のフルフォーム定義は失敗する

CREATE TABLE testGUIDs
(
    ID uniqueidentifier,
    Name varchar(40),
    CONSTRAINT DF_ID DEFAULT newid() FOR [ID]
)
GO

エラーあり

メッセージ 102、レベル 15、状態 1、行 5 'for' 付近の構文が正しくありません。

このエラーが発生する理由と、デフォルト制約の完全な定義を使用する方法を誰かが提案できますか?

4

3 に答える 3

1

列の横に宣言する必要があります

CREATE TABLE testGUIDs
(
    ID uniqueidentifier CONSTRAINT DF_ID DEFAULT newid(),
    Name varchar(40)    
)
GO

デフォルトの制約は、1 つの列にのみ適用できます。

の文法には、最後に宣言できるものtable_constraintは含まれていません。Default

于 2015-07-29T21:04:46.203 に答える
1
  1. id int PRIMARY KEY単一フィールド PK にのみ適用できます。制約には、システムによってデフォルト名が付けられます。後で制約を操作するために名前が必要になり、名前がわからない場合、これは問題です。
  2. id int CONSTRAINT PK_ID PRIMARY KEY単一フィールド PK にのみ適用できます。
  3. CONSTRAINT PK_ID PRIMARY KEY(col1, col2)複合主キーに適用できます。

あなたの問題について:インラインバリアントを使用しないのはなぜですか? とにかく、デフォルトの制約は単一の列にのみ適用できます。あなたの構文は単にサポートされていません。

于 2015-07-29T21:18:57.563 に答える