我正在尝试这样做:
ALTER TABLE CompanyTransactions DROP COLUMN Created
但我明白了:
msg 5074,16级,状态1,第2行 对象" df__companytr__creat__0cdae408"取决于列"创建"。 MSG 4922,16级,状态9,第2行 创建的Alter Table Drop列失败了,因为一个或多个对象访问此列。
这是一个代码第一表。不知何故,迁移都变得混乱了,我试图手动回滚一些变化。
我有 no 知道这是什么:
DF__CompanyTr__Creat__0CDAE408
您必须在删除列之前从列中删除constraints
。您引用的名称是default constraint
。
例如。
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
@sqlzim的答案是正确的,只是为了解释为什么会发生这种情况。我遇到了类似的问题,这是由非常纯真的事情引起的:将默认值添加到列
ALTER TABLE MySchema.MyTable ADD
MyColumn int DEFAULT NULL;
但是,在MS SQL Server的领域中,Colum上的默认值是一个约束。像每个约束一样,它都有标识符。如果列在约束中使用。
因此,您实际上可以做的事情避免这种问题始终给出您的默认约束显式名称,例如:
ALTER TABLE MySchema.MyTable ADD
MyColumn int NULL,
CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;
您仍然必须在删除列之前删除约束,但是您将至少在前。
已经写在答案中,您需要删除与您尝试删除的所有列有关的约束(由SQL自动创建(。
执行以下步骤来执行必要的步骤。
- 使用 sp_helpconstraint 获取所有约束的名称,这是系统存储过程实用程序 - 执行
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列或更多列
更改列datatype
时,您需要为每个数据库更改constraint key
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
您需要做一些事情:
- 您首先需要检查信息模式中的约束是否退出
- 然后,您需要加入sys.default_constraints和sys.columns来查询如果列和Default_constraints具有相同的对象ID
- 当您加入步骤2时,您将从default_constraints获得约束名称。您放弃那个约束。这是我这样做的一个示例。
-- 1. Remove constraint and drop column
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TABLE_NAME'
AND COLUMN_NAME = N'LOWER_LIMIT')
BEGIN
DECLARE @sql NVARCHAR(MAX)
WHILE 1=1
BEGIN
SELECT TOP 1 @sql = N'alter table [TABLE_NAME] drop constraint ['+dc.name+N']'
FROM sys.default_constraints dc
JOIN sys.columns c
ON c.default_object_id = dc.object_id
WHERE dc.parent_object_id = OBJECT_ID('[TABLE_NAME]') AND c.name = N'LOWER_LIMIT'
IF @@ROWCOUNT = 0
BEGIN
PRINT 'DELETED Constraint on column LOWER_LIMIT'
BREAK
END
EXEC (@sql)
END;
ALTER TABLE TABLE_NAME DROP COLUMN LOWER_LIMIT;
PRINT 'DELETED column LOWER_LIMIT'
END
ELSE
PRINT 'Column LOWER_LIMIT does not exist'
GO
除了接受答案之外,如果您使用的是 entity迁移用于更新数据库,则应在迁移中Up()
函数的启动时添加此行文件:
Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");
您可以在Nuget数据包管理器上的错误中找到约束名称,该名称以FK_dbo.
我也有相同的问题,这是一个对我有用的脚本,带有一个由两个零件名称分开的表"。
使用[Databasename]去Alter Table [TablEnamePart1]。[TablEnamePart2] Drop Constraint [df__ tablenamepart1d__columnname__5AEE82B9]去Alter Table [TablEnamePart1]。[TablEnamePart1] Drop列[columnName]去
我需要用GUID替换INT主键。经过几次失败的尝试,下面的EF代码对我有用。如果您设置了DefaultValue ...您最终会以单个GUID A为现有记录的密钥。
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);
}
从错误消息复制默认约束名称,并以与要删除的列相同的方式键入它。
我遇到了同样的问题,我无法删除迁移,这会显示出已应用的错误,所以我在AppSettings中更改了DB名称,删除了所有迁移,然后添加了新的新迁移迁移和奏效。不完全理解问题,但起作用
i通过在迁移中添加掉落约束来修复。
migrationBuilder.DropForeignKey(
name: "FK_XX",
table: "TableX").
及以下重现约束。
migrationBuilder.AddForeignKey(
name: "FK_XX",
table: "TableX",
column: "ColumnX",
onDelete: ReferentialAction.Restrict);