【发布时间】:2018-08-10 13:17:41
【问题描述】:
我尝试删除 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);
}
如何解决这个问题?
【问题讨论】:
-
再次检查约束的名称,你可能只是输入错误。或者您是否多次执行相同的语句?每个约束都有自己唯一的名称。在上面的语句中,该约束的名称是
PK_TblName -
@Igor 这是我想删除表名中所有主键的名字。
-
仅供参考,每个表只能有一个主数据库。
-
@Callout 不是 100% 清楚,但是如果这两个字段都定义为同一张表上的主键字段,那么不,那是一个由多个 列 组成的主键- 也称为复合主键。一个表中只能有一个主键。但无论如何,错误消息与此无关……您似乎正在尝试删除不存在的内容。
-
@Callout 没有向我们展示,而是在告诉我们。发个截图,不然我不信。
标签: sql sql-server primary-key alter-table