我正在尝试这样做:
ALTER TABLE CompanyTransactions DROP COLUMN Created
但我明白了:
Msg 5074,Level 16,State 1,Line 2 对象'DF__CompanyTr__Creat__0CDAE408'依赖于'Created'列。 Msg 4922,Level 16,State 9,Line 2 ALTER TABLE DROP COLUMN创建失败,因为一个或多个对象访问此列。
这是代码第一表。不知何故,迁移已经变得混乱,我试图手动回滚一些变化。
我没有知道这是什么:
DF__CompanyTr__Creat__0CDAE408
答案 0 :(得分:71)
在删除列之前,您必须从列中删除constraints
。您引用的名称是default constraint
。
e.g。
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
答案 1 :(得分:13)
@ SqlZim的回答是正确的,但只是为了解释为什么会发生这种情况。我有类似的问题,这是由非常无辜的事情引起的:为列添加默认值
ALTER TABLE MySchema.MyTable ADD
MyColumn int DEFAULT NULL;
但是在MS SQL Server领域,colum上的默认值是CONSTRAINT。和每个约束一样,它有一个标识符。如果在CONSTRAINT中使用它,则不能删除列。
所以你实际上可以做的就是避免这种问题总是给你的默认约束显式名称,例如:
ALTER TABLE MySchema.MyTable ADD
MyColumn int NULL,
CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;
在删除列之前,您仍然必须放弃约束,但是至少会先知道其名称。
答案 2 :(得分:3)
正如已经在答案中所写的那样,您需要删除与要删除的所有列相关的约束(由sql自动创建)。
执行以下步骤来做必要的事情。
exec sp_helpconstraint '<your table name>'
alter table <your_table_name>
drop constraint <constraint_name_that_you_copied_in_1>
(将仅是这种格式或类似格式)Alter table <YourTableName> Drop column column1, column2
等)删除1列或更多列答案 3 :(得分:2)
除了可接受的答案,如果您使用实体迁移来更新数据库,则应在迁移文件中Up()
函数的开头添加以下行:>
Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");
您可以在以FK_dbo.
开头的nuget数据包管理器控制台的错误中找到约束名称。
答案 4 :(得分:1)
您需要做一些事情:
for filename in os.listdir(config.Total2):
if filename.endswith(".pdf"):
First_Name, Last_Name, Zip = filename.replace(".pdf",'').split()
Name = First_Name + " " + Last_Name
print(Name)
print(Zip)
matches2 = df2[df['Member Name'].str.contains(Name) & df2['Member Address Line 3'].str.contains(Zip)]
if len(matches2) == 1:
row_index = matches2.iloc[0]['ID']
print("Match Found in DF2")
print(row_index)
# MemberID = df2.loc[row_index, 'ID']
MemberI = str(row_index)
os.rename(config.Total2+filename, config.ID+MemberI+'.pdf')
else:
print("Match not Found in DF2")
# os.rename(config.Total+filename, config.ManualCheck+filename+'.pdf')
matches1 = df[df['Member Name'].str.contains(Name) & df['Member Address Line 3'].str.contains(Zip)]
if len(matches1) == 1:
row_index = matches1.iloc[0]['ID']
print("Match Found in DF1")
print(row_index)
# MemberID = df.loc[row_index, 'ID']
MemberI = str(row_index)
os.rename(config.Total2+filename, config.ID+MemberI+'.pdf')
else:
print("Match not Found in DF1")
# print("No Match Found in DF1, Search Df2")
答案 5 :(得分:1)
我遇到了同样的问题,这是一个对我有用的脚本,它的表名由两部分组成,中间用句号“。”隔开。
使用[数据库名称] 走 ALTER TABLE [TableNamePart1]。[TableNamePart2]删除约束[DF__ TableNamePart1D__ColumnName__5AEE82B9] 走 ALTER TABLE [TableNamePart1]。[TableNamePart1] DROP COLUMN [ColumnName] 开始
答案 6 :(得分:1)
我需要用 Guid 替换 INT 主键。经过几次失败的尝试后,下面的 EF 代码对我有用。如果你 hyst 设置了 defaultValue...你最终会得到一个单一的 Guid 作为现有记录的键。
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropUniqueConstraint("PK_Payments", "Payments");
migrationBuilder.DropColumn(
name: "PaymentId",
table: "Payments");
migrationBuilder.AddColumn<Guid>(
name: "PaymentId",
table: "Payments",
type: "uniqueidentifier",
defaultValueSql: "NewId()",
nullable: false);
}
答案 7 :(得分:0)
当您更改列datatype
时,您需要为每个数据库更改constraint key
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];