sql - 删除约束不起作用

标签 sql sql-server

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

The object 'DF__PlantRecon__Test' is dependent on column 'Test'.

该列不属于任何键。但它有一个默认约束,并且该约束有一个预定义的名称。

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

  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

最佳答案

尝试

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() 上找到的)

关于sql - 删除约束不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23550777/

相关文章:

sql-server - 如何在 Liquibase 格式化 SQL 变更日志中定义参数

sql-server - 如何在两列 SQL Server 上应用唯一约束?

SQL 条件并集

sql - PostgreSQL 中的正则表达式无法按预期工作

python - 如何将数据从时间戳修改为每个用户每天的消耗量?

mysql - Mysql表分区

mysql - 从 mySQL 中检索至少一定数量的记录

php - 批量插入数据库

java - SQL Server 2014 的 JDBC 驱动程序

c# - 以编程方式连接和刷新 SQL Server Analysis Service 上的表格数据模型