sql - 如何在 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);
}
如何解决这个问题?
解决方案
尝试使用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)
)
;
在线演示
推荐阅读
- apache-spark - 字典数组的总和取决于值条件pyspark(spark结构化流)
- html - 定心
- docker - 带有 httpd24 的 Docker Centos 7
- r - 断棒回归线性混合效应模型
- javascript - Reactjs:我正在根据状态检查单选按钮,但在选中一个单选按钮时无法单击其他单选按钮
- html - 图像未在 React 中显示
- c++ - 遍历 unique_ptr 拥有的内存会产生段错误
- angular - 将数组转换为接口数组
- javascript - 如何从 Axios 获取来自多个 API 的响应并使用 Promise.all 在 DataTable 中设置数据
- c# - 在 ASP.NET MVC 对象列表中发布文件