首页 > 解决方案 > 如何在 SQL 中再删除一个主键?

问题描述

我尝试删除 SQL 上一张表的所有主键。如果我有一个主键,我可以删除此代码行:

ALTER TABLE dbo.TblName DROP CONSTRAINT PK_TblName;

但是,如果我还有一个主键,我会犯这个错误:

消息 3728,级别 16,状态 1,第 18 行“PK_TblBooks”不是约束。消息 3727,级别 16,状态 0,第 18 行无法删除约束。请参阅以前的错误。

我在 C# 上尝试了这个,但它们没有被删除:

String sql= "SELECT COL_NAME(ic.object_id,ic.column_id) AS ColumnName FROM sys.indexes AS i INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id WHERE i.is_primary_key = 1 AND ic.object_id = i.object_id";
SqlCommand cmd= new SqlCommand(sql, con);
SqlDataAdapter adp= new SqlDataAdapter(cmd);
DataTable dtsk = new DataTable();
adp.Fill(dtsk);

for (int i = 0; i < dtsk.Rows.Count; i++)
{
String remove= "ALTER TABLE " + Table + " DROP CONSTRAINT PK_" + Table + "";
SqlCommand cmd1= new SqlCommand(remove, con);
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
}

如何解决这个问题?

标签: sqlsql-serverprimary-keyalter-table

解决方案


尝试使用dynamic sql删除某些表的pk。

declare @sql nvarchar(max) = '';
with CTE as (
  select T1.*,T2.name tableName from sys.key_constraints T1
  left join sys.objects T2 on T1.parent_object_id = T2.object_id
  where T2.name = 'T' --your table name
)
select @sql = concat(@sql,'ALTER table ',tableName,' DROP CONSTRAINT ',name,';')
from CTE;

exec(@sql); --delete T table all pk 

select * from sys.key_constraints; --result:null

测试 DDL:

CREATE TABLE T
    ([col1] varchar(2), [col2] varchar(2)
       ,constraint PK_TblName unique (col1)
       ,constraint PK_TblName2 unique (col1)
    )
;

在线演示


推荐阅读