SQLServer 为列添加默认值

Mar*_*ink 3 sql-server constraint default-value alter-table

我正在使用 MS SQL Server。我有一个带有“action_type”列的“action”表,我想为其设置默认值“to do”。我在 MS SQL Studio 中的 DDL 错误!我已经阅读了许多文章,试图找出我做错了什么,但似乎没有任何效果。DDL如下,表CREATE有效,ALTER失败。

CREATE TABLE "action"
( "action" INT IDENTITY(1,1)
, "name" VARCHAR(250) NOT NULL
, "owner" VARCHAR(50)
, "action_type" VARCHAR(50) NOT NULL
, "due_date" DATETIME
, "done_date" DATETIME
, "successful" BIT NOT NULL
, "job" INT
, "contract" INT
, "person" INT
, "description" VARCHAR(MAX)
, "deliverable" VARCHAR(MAX)
, "outcome" VARCHAR(MAX)
, "source" VARCHAR(50)
, "notes" VARCHAR(MAX)
);
ALTER TABLE "action"
ADD CONSTRAINT "df_action_0" DEFAULT "To Do" FOR "action_type";
Run Code Online (Sandbox Code Playgroud)

ALTER 语句返回错误

消息 128,级别 15,状态 1,第 4 行 在此上下文中不允许使用名称“待办事项”。有效的表达式是常量、常量表达式和(在某些上下文中)变量。不允许使用列名。

根据各种文章,我尝试将“待办事项”替换为“待办事项”、“待办事项”、(“待办事项”)等,但没有任何效果。

scs*_*mon 11

这是你的报价。如果您删除它们,并将文字更改为使用单引号,则应该没问题。SQL Servers DEFAULT 是SET QUOTED_IDENTIFIER ON并且使用此文字必须用单引号分隔。所以,你真的只需要改变这部分:

演示

ALTER TABLE "action"
ADD CONSTRAINT "df_action_0" DEFAULT 'To Do' FOR "action_type";
Run Code Online (Sandbox Code Playgroud)

但是,您会更常见地看到不以这种方式使用的双引号,而是您的 DDL 将被编写为:

CREATE TABLE action
( action INT IDENTITY(1,1)
, name VARCHAR(250) NOT NULL
, owner VARCHAR(50)
, action_type VARCHAR(50) NOT NULL 
, due_date DATETIME
, done_date DATETIME
, successful BIT NOT NULL
, job INT
, contract INT
, person INT
, description VARCHAR(MAX)
, deliverable VARCHAR(MAX)
, outcome VARCHAR(MAX)
, source VARCHAR(50)
, notes VARCHAR(MAX)
);

ALTER TABLE action
ADD CONSTRAINT df_action_0 DEFAULT 'To Do' FOR action_type;
Run Code Online (Sandbox Code Playgroud)