我正在尝试这样做:
ALTER TABLE CompanyTransactions DROP COLUMN Created
但我明白了:
消息 5074,第 16 级,状态 1,第 2 行 对象“DF__CompanyTr__Creat__0CDAE408”依赖于“Created”列。 消息 4922,16 级,状态 9,第 2 行 ALTER TABLE DROP COLUMN 创建失败,因为一个或多个对象访问此列。
这是一个代码优先表。不知何故,迁移变得一团糟,我正在尝试手动回滚一些更改。
我不知道这是什么:
DF__CompanyTr__Creat__0CDAE408
constraints
。您引用的名称是
default constraint
。例如
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
ALTER TABLE MySchema.MyTable ADD
MyColumn int DEFAULT NULL;
但在 MS SQL Server 领域,列上的默认值是 CONSTRAINT。与每个约束一样,它也有一个标识符。如果列在 CONSTRAINT 中使用,则无法删除该列。
因此,您实际上可以避免此类问题的方法是始终为默认约束指定一个
显式名称,例如:
ALTER TABLE MySchema.MyTable ADD
MyColumn int NULL,
CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;
您仍然需要在删除列之前删除约束,但您将
至少预先知道它的名称。
执行以下步骤来执行必要的操作。
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
等
datatype
时,您需要为每个数据库更改
constraint key
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
-- 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 Migrations 来更新数据库,您应该在迁移文件中的 Up()
函数的开头添加此行:
Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");
您可以在 nuget 数据包管理器控制台的错误中找到以 FK_dbo.
使用[数据库名称] 去 更改表 [TableNamePart1].[TableNamePart2] 删除约束 [DF__ TableNamePart1D__ColumnName__5AEE82B9] 去 ALTER TABLE [TableNamePart1].[ TableNamePart1] 删除列 [ColumnName] 去吧
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);
}
migrationBuilder.DropForeignKey(
name: "FK_XX",
table: "TableX").
下面重新创建约束。
migrationBuilder.AddForeignKey(
name: "FK_XX",
table: "TableX",
column: "ColumnX",
onDelete: ReferentialAction.Restrict);
SELECT d.name FROM sys.default_constraints d
INNER JOIN sys.columns c
ON d.parent_column_id = c.column_id
WHERE d.parent_object_id = OBJECT_ID(N'HumanResources.Employee', N'U')
AND c.name = 'VacationHours';
更改表名称“HumanResources.Employee”和“VacationHours”。修改自
https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2005/ms173758(v=sql.90)