복붙노트

[SQL] 개체 'DF __ *'는 '*'컬럼에 따라 달라집니다 - 더블로 INT 변경

SQL

개체 'DF __ *'는 '*'컬럼에 따라 달라집니다 - 더블로 INT 변경

기본적으로 나는 다음과 같은 특성을 가진 내 EF 데이터베이스에서 테이블을 가지고 :

public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Image { get; set; }
public string WatchUrl { get; set; }
public int Year { get; set; }
public string Source { get; set; }
public int Duration { get; set; }
public int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }

나는 데이터베이스를 업데이트 할 때 나는 다음과 같은 오류가 더블을 할 평가의 INT를 변경할 때 그러나 그것은 잘 작동 :

개체 'DF_Movies_Rating__48CFD27E은'열 '평가'에 따라 달라집니다. 하나 이상의 개체가이 열에 액세스하므로 ALTER TABLE ALTER 열 평가에 실패했습니다.

문제는 무엇입니까?

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    당신의 필드 유형을 변경하기 전에 제약 DF_Movies_Rating__48CFD27E를 제거합니다.

    제약 조건은 일반적으로 DBMS (SQL 서버)에 의해 자동으로 생성됩니다.

    아래 그림과 같이 분류 제약 다음 개체 탐색기에서 테이블 속성을 확장 테이블과 연관된 제약 조건을 참조하십시오 :

    당신은 필드 유형을 변경하기 전에 제약 조건을 제거해야합니다.

  2. ==============================

    2.이것은 TSQL의 방법입니다

    이것은 TSQL의 방법입니다

     ALTER TABLE yourtable DROP CONSTRAINT constraint_name     -- DF_Movies_Rating__48CFD27E
    

    완성도를 들어,이 그냥 답변으로 @Joe 타 라스의 코멘트를 보여줍니다

  3. ==============================

    3.나는 제약의 출처를 설명하는 응답으로이 추가 해요. 내가 코멘트에 그것을 할 시도했지만 멋지게이 편집에 어려운 : - /

    나는 제약의 출처를 설명하는 응답으로이 추가 해요. 내가 코멘트에 그것을 할 시도했지만 멋지게이 편집에 어려운 : - /

    기본적 값이 C 럼으로 테이블을 작성 (또는 ALTER) 경우 당신을위한 제약 조건을 생성합니다.

    예를 들어 테이블에서 그것은 수 있습니다 :

    CREATE TABLE Movie (
        ...
        rating INT NOT NULL default 100
    )
    

    그것은 기본적으로 100에 대한 제약 조건을 생성합니다.

    대신 작성하는 경우가 너무 좋아

    CREATE TABLE Movie (
      name VARCHAR(255) NOT NULL,
      rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100
    );
    

    당신이 변질 때 그런 다음 표했다 참조에 쉽게 멋지게라는 이름의 제약을받을.

    ALTER TABLE Movie DROP CONSTRAINT rating_default;
    ALTER TABLE Movie ALTER COLUMN rating DECIMAL(2) NOT NULL;
    -- sets up a new default constraint with easy to remember name
    ALTER TABLE Movie ADD CONSTRAINT rating_default DEFAULT ((1.0)) FOR rating;
    

    당신이 열을 변경하고 한 줄의 제약 조건의 이름을, 그래서 당신은 그 마지막이 문을 결합 할 수 있습니다 (당신은 어쨌든이 기존 테이블의 경우에 있습니다)

  4. ==============================

    4.제약 예측할 수없는 이름을 가지고, 당신은 그것의 이름을 (EF 6.1.3에서 테스트되었습니다) 알고 있기없이 그것을 제거하기 위해 특수 스크립트 (DropConstraint를) 쓸 수 있습니다 :

    제약 예측할 수없는 이름을 가지고, 당신은 그것의 이름을 (EF 6.1.3에서 테스트되었습니다) 알고 있기없이 그것을 제거하기 위해 특수 스크립트 (DropConstraint를) 쓸 수 있습니다 :

    public override void Up()
    {    
        DropConstraint();
        AlterColumn("dbo.MyTable", "Rating", c => c.Double(nullable: false));
    }
    
    private void DropConstraint()
    {
        Sql(@"DECLARE @var0 nvarchar(128)
              SELECT @var0 = name
              FROM sys.default_constraints
              WHERE parent_object_id = object_id(N'dbo.MyTable')
              AND col_name(parent_object_id, parent_column_id) = 'Rating';
              IF @var0 IS NOT NULL
                  EXECUTE('ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [' + @var0 + ']')");
    }
    
    public override void Down()
    {            
        AlterColumn("dbo.MyTable", "Rating", c => c.Int(nullable: false));    
    }
    
  5. ==============================

    5.MS SQL Studio는 열을 삭제할 때 돌봐하지만 제약 프로그래밍을 삭제해야하는 경우 여기에 간단한 해결책이다

    MS SQL Studio는 열을 삭제할 때 돌봐하지만 제약 프로그래밍을 삭제해야하는 경우 여기에 간단한 해결책이다

    여기에 기본 제약 조건을 가진 열을 삭제합니다 코드 조각입니다 :

    DECLARE @ConstraintName nvarchar(200)
    SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = OBJECT_ID(N'__TableName__'))
    IF @ConstraintName IS NOT NULL
    EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
    IF EXISTS (SELECT * FROM syscolumns WHERE id=object_id('__TableName__') AND name='__ColumnName__')
    EXEC('ALTER TABLE __TableName__ DROP COLUMN __ColumnName__')
    

    그냥 적절한 값으로 테이블 이름과 열 이름을 대체합니다. 안전하게 열이 이미 삭제 된 경우에도이 프로그램을 실행할 수 있습니다.

    보너스 : 여기에 외래 키 제약 조건의 다른 유형을 삭제하는 코드입니다.

  6. ==============================

    6.우리가 의존하는 열을 삭제하려고 할 때 우리는 이런 종류의 오류를 참조하십시오

    우리가 의존하는 열을 삭제하려고 할 때 우리는 이런 종류의 오류를 참조하십시오

    와 해당 열의에 의존하는 제약 조건을 삭제 :

    ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;
    

    예:

    드롭 제약 (DF__Employees__Colf__1273C1CD) :

    ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;
    

    그럼 당신은 열을 드롭 할 수 있습니다 :

    Alter Table TableName Drop column ColumnName
    
  7. ==============================

    7.개방 데이터베이스 테이블 -> 테이블을 확장 -> 제약을 확장하여이 참조

    개방 데이터베이스 테이블 -> 테이블을 확장 -> 제약을 확장하여이 참조

  8. ==============================

    8.나는 마이그레이션을 실행하려고이 오류가 있었다 이를 해결하려면 내가 열 이름을 변경하고 사용하여 마이그레이션을 재 생성

    나는 마이그레이션을 실행하려고이 오류가 있었다 이를 해결하려면 내가 열 이름을 변경하고 사용하여 마이그레이션을 재 생성

    add-migration migrationname -force
    

    패키지 관리자 콘솔한다. 나는 그 실행 할 수 있었다

    update-database
    

    성공적으로.

  9. from https://stackoverflow.com/questions/19460912/the-object-df-is-dependent-on-column-changing-int-to-double by cc-by-sa and MIT license