【问题标题】:Drop a Constraint doesn’t work删除约束不起作用
【发布时间】:2014-05-08 19:25:04
【问题描述】:

在删除 SQL Server 2005 中具有约束的列时出现以下错误。

对象“DF__PlantRecon__Test”依赖于列“Test”。

该列不是任何键的一部分。但它有一个default 约束,并且该约束有一个预定义的名称。

虽然我已经编写了代码先删除约束,但它不起作用。

  1. 为什么不起作用?
  2. 需要做什么才能使其正常工作?

注意:我需要先检查约束是否存在。

参考文献

  1. Named CONSTRAINT benefits
  2. How to drop column with constraint?
  3. How to drop SQL default constraint without knowing its name?

代码

IF OBJECT_ID('DF__PlantRecon__Test', 'C') IS NOT NULL 
BEGIN
    SELECT 'EXIST'
    ALTER TABLE [dbo].[PlantReconciliationOptions] drop constraint DF__PlantRecon__Test
END

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME ='DF__PlantRecon__Test')
BEGIN

    SELECT 'EXIST'
    --drop  constraint
    ALTER TABLE [dbo].[PlantReconciliationOptions] drop constraint DF__PlantRecon__Test
END

IF EXISTS ( SELECT * FROM   sys.columns WHERE  object_id = OBJECT_ID(N'[dbo].[PlantReconciliationOptions]') AND name = 'Test')
BEGIN
    --drop column
    ALTER TABLE [dbo].[PlantReconciliationOptions] DROP COLUMN Test
END

ALTER TABLE PlantReconciliationOptions
ADD Test INT NOT NULL 
CONSTRAINT DF__PlantRecon__Test  DEFAULT 30

【问题讨论】:

  • (为什么要进行两次约束检查/删除?)

标签: sql sql-server


【解决方案1】:

试试

IF OBJECT_ID('DF__PlantRecon__Test') IS NOT NULL 
BEGIN
    SELECT 'EXIST'
    ALTER TABLE [dbo].[PlantReconciliationOptions] drop constraint DF__PlantRecon__Test
END

在您的示例中,您正在寻找一个“C”检查约束,而 DEFAULT 不是。您可以将“C”更改为“D”或一起省略参数。

如果您的命名与您的名称一致(例如 DF__xxx),那么删除第二个参数是一个可接受的选择,以确保删除硬编码的约束名称。

这是您可以传递的 OBJECT_ID() 对象类型的列表:

AF = Aggregate function (CLR)
C = CHECK constraint
D = DEFAULT (constraint or stand-alone)
F = FOREIGN KEY constraint
PK = PRIMARY KEY constraint
P = SQL stored procedure
PC = Assembly (CLR) stored procedure
FN = SQL scalar function
FS = Assembly (CLR) scalar function
FT = Assembly (CLR) table-valued function
R = Rule (old-style, stand-alone)
RF = Replication-filter-procedure
S = System base table
SN = Synonym
SQ = Service queue
TA = Assembly (CLR) DML trigger
TR = SQL DML trigger
IF = SQL inline table-valued function
TF = SQL table-valued-function
U = Table (user-defined)
UQ = UNIQUE constraint
V = View
X = Extended stored procedure
IT = Internal table

(此列表在 Beyond Relational: Using TSQL Function: OBJECT_ID() 上找到)

【讨论】:

  • 命令 OBJECT_ID('DF__PlantRecon__Test') 将返回一个值,而 OBJECT_ID('DF__PlantRecon__Test', 'C') 不会。因此,在这种情况下,默认约束将被删除。
【解决方案2】:

解决问题的步骤。

  1. 打开 SSMS。
  2. 编辑表格以删除默认值。 不要按保存
  3. 脚本输出到“新窗口”。
  4. 阅读脚本。

【讨论】:

  • 那无济于事。我需要先检查它是否存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2018-12-30
  • 2015-03-13
  • 2016-12-27
  • 1970-01-01
  • 2011-04-11
  • 2017-08-24
相关资源
最近更新 更多