改变列SQL的DEFAULT约束

时间:2013-12-03 22:54:52

标签: sql-server tsql

我有一个用于创建表的SQL脚本,我希望除了几列之外的所有列的默认值为“”其他列需要整数默认值为0

以下创建表格。删除了一些列,因为有很多

CREATE TABLE [dbo].[PMIPatients]
(
[PID] [varchar](30) NOT NULL,
[PatientFirstName] [varchar](30) NULL,
[PatientLastName] [varchar](30) NULL,
[PatientDOB] [varchar](30) NULL,
[PatientDoctor] [varchar](30) NULL,
[PatientDiet] [varchar](50) NULL,
[PatientFallRiskLevel] [int] NULL,
[BedId] [int] NULL,
[BedDisplayInfo] TEXT NOT NULL DEFAULT ''
CONSTRAINT [PK_HL7Patient] PRIMARY KEY CLUSTERED 
([PID] ASC) WITH (PAD_INDEX  = OFF,
    STATISTICS_NORECOMPUTE  = OFF,
    IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS  = ON,
    ALLOW_PAGE_LOCKS  = ON)
ON [PRIMARY]
) 
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我希望在所选列上设置不同的默认值,以下代码不起作用,因为它表示已经存在默认约束集。所以我认为我必须首先放弃约束。

ALTER TABLE [dbo].[PMIPatients] ADD  
DEFAULT ((0)) 
FOR [PatientFallRiskLevel]

http://www.w3schools.com/sql/sql_default.asp表示以下代码应该能够像这样删除DEFAULT

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT

但是我在DEFAULT

上遇到语法错误

如何更改/删除特定列的DEFAULT约束

3 个答案:

答案 0 :(得分:14)

添加默认值时,应使用约束的名称。这样,您可以稍后通过名称引用这些约束。

ALTER TABLE [dbo].[PMIPatients] ADD CONSTRAINT [PatientFallRiskLevel_Default] DEFAULT ((0)) FOR PatientFallRiskLevel

然后你可以使用:

删除它
ALTER TABLE [dbo].[PMIPatients] DROP CONSTRAINT [PatientFallRiskLevel_Default] 

答案 1 :(得分:2)

语法为:

ALTER TABLE [dbo].[PMIPatients] ADD CONSTRAINT NameYourConstraint DEFAULT ((0))  FOR [PatientFallRiskLevel]  

ALTER TABLE [dbo].[PMIPatients] DROP CONSTRAINT NameYourConstraint 

答案 2 :(得分:0)

创建没有名称的约束时,SQL Server将自动创建内部名称。可以在[sys].[default_constraints]中看到。

例如:

DROP TABLE IF EXISTS [dbo].[StackOverflow];

CREATE TABLE [dbo].[StackOverflow]
(
    [colA] INT
   ,[colB] INT DEFAULT(0)
   ,[colC] CHAR(1) DEFAULT('x')
);

GO

SELECT *
FROM [sys].[default_constraints]
WHERE [parent_object_id] = OBJECT_ID('[dbo].[StackOverflow]');

GO

您可以使用名称来删除约束。

如果有更多脚本,则可以使用以下脚本之一:

-- all suported editions
DECLARE @DynamicTSQLStataement NVARCHAR(MAX)
       ,@TableNameWithSchema SYSNAME;

SET @TableNameWithSchema = '[dbo].[StackOverflow]';

SELECT @DynamicTSQLStataement = STUFF
(
    (
        SELECT ';ALTER TABLE ' + @TableNameWithSchema + ' DROP CONSTRAINT ' + QUOTENAME([name])
        FROM [sys].[default_constraints]
        WHERE [parent_object_id] = OBJECT_ID('[dbo].[StackOverflow]')
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
);

EXEC sp_executesql @DynamicTSQLStataement;

GO

-- SQL Server 2016 or later

DECLARE @DynamicTSQLStataement NVARCHAR(MAX)
       ,@TableNameWithSchema SYSNAME;

SET @TableNameWithSchema = '[dbo].[StackOverflow]';

SELECT @DynamicTSQLStataement = STRING_AGG('ALTER TABLE ' + @TableNameWithSchema + ' DROP CONSTRAINT ' + QUOTENAME([name]), ';')
FROM [sys].[default_constraints]
WHERE [parent_object_id] = OBJECT_ID('[dbo].[StackOverflow]');

EXEC sp_executesql @DynamicTSQLStataement;

GO