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 TABLE我在这里看到了完整的用法

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

默认约束只能应用于单个列。

for 的语法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 回答
1

CREATE TABLE发生错误是因为命令中默认约束的语法与ALTER TABLE. 仅仅因为一个命令使用一种语法,你不能假设它对所有命令都是相同的。

CREATE TABLE命令中,语法要求在列之后定义具有默认值的约束:

<column_definition> ::=column_name <data_type>
...
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
...

将 constant_expression 定义为:

是常量、NULL 或用作列的默认值的系统函数。

但在ALTER TABLE中,语法是:

...
| ADD <table_constraint> 
...

table_contraint的语法是:

[ CONSTRAINT constraint_name ] 
{ 
    ...
    | DEFAULT constant_expression FOR column [ WITH VALUES ] 
    ...
}

可以在单个ALTER TABLE命令中定义许多更改,因此需要指定列名。

所以没有“完整形式”的语法CREATE TABLE

于 2015-07-29T21:23:39.053 回答