Sql server 更改列SQL上的默认约束
我有一个用于创建表的SQL脚本,我希望除少数列之外的所有列的默认值都是“”,其他列需要默认值为0的整数 下面创建了该表。由于存在很多列,因此删除了一些列Sql server 更改列SQL上的默认约束,sql-server,tsql,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
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]
表示下面的代码应该能够像这样删除默认值
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
但是我在默认情况下得到了一个语法错误
如何更改/删除特定列的默认约束语法为:
ALTER TABLE [dbo].[PMIPatients] ADD CONSTRAINT NameYourConstraint DEFAULT ((0)) FOR [PatientFallRiskLevel]
ALTER TABLE [dbo].[PMIPatients] DROP CONSTRAINT NameYourConstraint
添加默认值时,应为约束使用名称。这样,您可以在以后按名称引用这些约束
ALTER TABLE [dbo].[PMIPatients] ADD CONSTRAINT [PatientFallRiskLevel_Default] DEFAULT ((0)) FOR PatientFallRiskLevel
然后,您可以使用以下方法将其删除:
ALTER TABLE [dbo].[PMIPatients] DROP CONSTRAINT [PatientFallRiskLevel_Default]
创建没有名称的约束时,
SQL Server
会自动创建内部名称。它可以在[sys].[default\u 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
或
您使用的是什么数据库?@GOATCO MSSQL expressor只是不使用w3school,而是使用MSDN作为第一手信息。可能存在重复,因此我必须更改不同名称下每列的默认约束是的,没错。这样,您可以在以后按名称引用这些约束。如果您不使用自己的名称,SLQ服务器将为您生成一个名称。
-- 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