更改表

时间:2016-07-12 10:49:53

标签: c# sql linq tsql ado.net

在表格中更改PrimaryKey时出现问题。

错误:“无法在可为空的列上创建IDENTITY属性。”

详情

  • “update”是从DataSourceObject和IClonable派生的类的可枚举
  • “table”是从DataSourceObject派生的类

代码

foreach (var u in update)
{
   myList.Add(string.Format("alter table [{0}] alter column {1} {2} {3};", table.Name, u.Name, (u.IsPrimary || u.IsAutoIncrement) ? "not null" : "null"));
}

我也试过删除所有的PrimaryKeys:

foreach (var u in update.Where(x => x.IsPrimary))
{    
   myList.Add(string.Format("alter table [{0}] drop constraint {1}", table.Name, u.Name));
}

但它说当前我试图设置为PrimaryKey的项目不是约束。

我还提到如果我以这种方式更改if语句(反之亦然):

(u.IsPrimary || u.IsAutoIncrement) ? "null" : "not null";

当我尝试更改主键时,它可以工作。我的意思是,如果我先更改主键,那么会有一个例外,然后我更改if语句,然后更改PrimaryKey它可以完成业务。

更新:现在我肯定知道我必须找到一个我要删除的约束名称,在我的情况下它将是默认名称 - ID(可以使用sys schema完成,但我不知道如何使用它),然后我必须删除它,毕竟我必须生成一个新名称的新约束。

1 个答案:

答案 0 :(得分:0)

结果查询:

declare @CONSTRAINTNAME varchar(128);
declare @script nvarchar(max);

select top 1 @CONSTRAINTNAME = t1.CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS t1
where CONSTRAINT_TYPE = 'PRIMARY KEY' and upper(t1.TABLE_NAME) = @tableName;

set @script = N'alter table [' + @tableName + N'] drop constraint [' + @CONSTRAINTNAME + N']';
exec sp_executesql @script

set @script = N'alter table [' + @tableName + N'] add constraint [' + @tableName + '_' + @columnName + N'] primary key (['+ @columnName +'])';
exec sp_executesql @script