Transact-SQL 参考

CREATE DEFAULT

创建称为默认值的对象。当绑定到列或用户定义数据类型时,如果插入时没有明确提供值,默认值便指定一个值,并将其插入到对象所绑定的列中(或者,在用户定义数据类型的情况下,插入到所有列中)。默认值是一个向后兼容的功能,它执行一些与使用 ALTER 或 CREATE TABLE 语句的 DEFAULT 关键字创建的默认值定义相同的功能。默认值定义是限制列数据的首选并且标准的方法,因为定义和表存储在一起,当除去表时,将自动除去默认值定义。然而,当在多个列中多次使用默认值时,默认值也有其优点。

语法

CREATE DEFAULT default
    AS constant_expression

参数

default

默认值的名称。默认值名称必须符合标识符的规则。可以选择是否指定默认值所有者名称。

constant_expression

只包含常量值的表达式(不能包含任何列或其它数据库对象的名称)。可以使用任何常量、内置函数或数学表达式。字符和日期常量用单引号 (') 引起来;货币、整数和浮点常量不需要使用引号。二进制数据必须以 0x 开头,货币数据必须以美元符号 ($) 开头。默认值必须与列数据类型兼容。

注释

只能在当前数据库中创建默认值的名称。在数据库中,每个所有者的各默认值名称必须是唯一的。创建默认值后,使用 sp_bindefault 将其绑定到列或用户定义数据类型。

如果默认值和其绑定到的列不兼容,则在尝试插入默认值时,Microsoft® SQL Server™ 会生成错误信息。例如,N/A 不能用作 numeric 列的默认值。

如果默认值对于它所绑定的列而言太长,该值就会被截断。

在单个批处理中,CREATE DEFAULT 语句不能与其它 Transact-SQL 语句组合使用。

在以相同的名称创建新的默认值之前,必须除去原有的默认值,在除去前,必须通过执行 sp_unbindefault 来取消对该默认值的绑定。

如果列同时有默认值和规则与之关联,则默认值不能违反规则。与规则冲突的默认值将永远不能插入列,每次试图插入这样的默认值时,SQL Server 都会生成错误信息。

当绑定到列以后,在以下情况下将插入默认值:

如果在创建列时指定 NOT NULL 并且没有为其创建默认值,则当用户未能为该列输入项时,就会生成错误信息。下表说明默认值的存在性与将列定义为 NULL 或 NOT NULL 之间的关系。表中的条目显示了结果。

列定义 没有输入项,
没有默认值
没有输入项,有默认值 输入 NULL,
没有默认值
输入 NULL,有默认值
NULL NULL default NULL NULL
NOT NULL Error default error error

说明  SQL Server 是将空字符串解释为单个空格还是解释为真正的空字符串,由 sp_dbcmptlevel 的设置控制。如果兼容级别小于或等于 65,SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70,则 SQL Server 将空字符串解释为空字符串。有关更多信息,请参见 sp_dbcmptlevel

若要重命名默认值,请使用 sp_rename。若要获得默认值的报表,请使用 sp_help

权限

CREATE DEFAULT 的权限默认授予 sysadmin 固定服务器角色成员和 db_ownerdb_ddladmin 固定数据库角色成员。sysadmindb_ownerdb_securityadmin 角色的成员可以将权限转让给其他用户。

示例
A.创建简单的字符默认值

下面的示例创建字符默认值 unknown。

USE pubs
GO
CREATE DEFAULT phonedflt AS 'unknown'
B.绑定默认值

下面的示例绑定示例 A 中创建的默认值。只有当 authors 表的 phone 列没有输入项时,该默认值才起作用。请注意,没有输入项和显式指定空值不同。

因为名为 phonedflt 的默认值不存在,所以下列 Transact-SQL 语句将失败。本例只用于演示。

USE pubs
GO
sp_bindefault phonedflt, 'authors.phone'

请参见

ALTER TABLE

批处理

CREATE RULE

CREATE TABLE

DROP DEFAULT

DROP RULE

表达式

INSERT

sp_bindefault

sp_help

sp_helptext

sp_rename

sp_unbindefault

使用标识符