Cas*_*ton 49 c# sql sql-server code-first
我想这样做:
ALTER TABLE CompanyTransactions DROP COLUMN Created
Run Code Online (Sandbox Code Playgroud)
但我明白了:
Msg 5074,Level 16,State 1,Line 2对象'DF__CompanyTr__Creat__0CDAE408'依赖于'Created'列.消息4922,级别16,状态9,行2 ALTER TABLE DROP COLUMN创建失败,因为一个或多个对象访问此列.
这是代码第一表.不知怎的,迁移已经变得混乱,我试图手动回滚一些变化.
我不知道这是什么:
DF__CompanyTr__Creat__0CDAE408
Run Code Online (Sandbox Code Playgroud)
Sql*_*Zim 91
在删除constraints列之前,必须从列中删除它.您引用的名称是default constraint.
例如
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
Run Code Online (Sandbox Code Playgroud)
mal*_*c4k 15
@ SqlZim的答案是正确的,但只是为了解释为什么会发生这种情况.我有类似的问题,这是由非常无辜的事情引起的:为列添加默认值
ALTER TABLE MySchema.MyTable ADD
MyColumn int DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)
但在MS SQL Server领域,colum上的默认值是CONSTRAINT.和每个约束一样,它有一个标识符.如果在CONSTRAINT中使用它,则不能删除列.
所以你实际上可以做的就是避免这种问题总是给你的默认约束一个明确的名字,例如:
ALTER TABLE MySchema.MyTable ADD
MyColumn int NULL,
CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;
Run Code Online (Sandbox Code Playgroud)
在删除列之前,您仍然必须删除约束,但您至少会事先知道它的名称.
正如答案中已经写的那样,您需要删除与您尝试删除的所有列相关的约束(由 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 个或多个列您需要做几件事:
-- 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
Run Code Online (Sandbox Code Playgroud)
小智 5
当您更改列时,datatype您需要constraint key为每个数据库进行更改
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
Run Code Online (Sandbox Code Playgroud)