我有一个用于创建表的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约束
答案 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