IDENTITY_INSERT가 OFF로 설정된 경우 'table'테이블에서 ID 열에 명시 적 값을 삽입 할 수 없습니다.


361

다음 스크립트를 실행할 때 아래와 같은 오류가 발생합니다. 오류는 무엇이며 어떻게 해결할 수 있습니까?

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

오류:

서버 : 메시지 544, 수준 16, 상태 1, 줄 1

IDENTITY_INSERT가 OFF로 설정된 경우 'table'테이블에서 ID 열에 명시 적 값을 삽입 할 수 없습니다.



2
@HimanshuAhuja이 질문 (1334012)은 10 살입니다. 하나만 연결 한 것입니다. 그러나 자세히 살펴보면 그것들이 다르다는 것을 알게 될 것입니다 (새로운 것은 IDENTITY_INSERT를 ON으로 지정합니다). 깃발 / 설명을 삭제하십시오.
jasie 2009 년

@jasie는 내가이 깃발을 올렸을 때 기억 나지 않기 때문에 그렇게 할 것입니다
Himanshu Ahuja

답변:


467

OperationId그 값을 ID 열에 삽입하고 있습니다 .

이와 같이 테이블에서 ID 삽입을 켜서 고유 한 ID 값을 지정할 수 있습니다.

SET IDENTITY_INSERT Table1 ON

INSERT INTO Table1
/*Note the column list is REQUIRED here, not optional*/
            (OperationID,
             OpDescription,
             FilterID)
VALUES      (20,
             'Hierachy Update',
             1)

SET IDENTITY_INSERT Table1 OFF 

14
+1 정확하게-명시 적 인서트를 허용하는 옵션을 다음 삽입 한 다음 옵션을 다시 끕니다
marc_s

13
ID 열에 실제로 값을 추가하려면 이것이 당신의 대답이지만 다른 한편으로 누군가가 삽입 할 때 열 자체가 증가하도록 설정했습니다. 이 경우 테이블은 다음 사용 가능한 번호를 추적하므로 사용자가 OperationID를 생성 할 필요가 없습니다. 새 ID는 SELECT SCOPE_IDENTITY ()로 가져올 수 있습니다.
Hakan Winther

15
위험한 연습, 왜 그것이 나쁜 생각인지에 대한 경고없이 그것을 사용하지 않는 것이 좋습니다. 매우 가난한 대답.
HLGEM

7
좋은 대답이지만 자신이하고있는 일을 알아야합니다. 저에게 외래 키가 다른 테이블과 일치해야하는 데이터가있는 데이터베이스를 시드하는 것이 유용합니다
Berty

2
@UlyssesAlves :이 옵션은 데이터베이스 전체의 단일 테이블에 대해서만 설정할 수 있으므로 한 테이블에 그대로두면 다른 테이블에 사용할 수 없습니다. 또한 : 켜져 있어야하는 옵션이 아닙니다.-기본적으로 SQL Server에서 ID 값을 처리하도록해야합니다. 이는 매우 특정한 경우에 대한 최후 수단 수단으로 사용됩니다. 여가 ...
marc_s

61

자동으로 생성되므로 OperationID에 값을 넣지 마십시오. 이 시도:

Insert table(OpDescription,FilterID) values ('Hierachy Update',1)

5
당신이 자동으로 생성 OperationID하려면이 정답이다
shaijut을

46

SQL 서버 에서이 오류가 발생하면이 쿼리를 실행하십시오.

SET IDENTITY_INSERT tableName ON

이것은 하나의 databse 테이블 만 작동합니다. 예를 들어 테이블 이름이 학생 인 경우 쿼리는 다음과 같습니다 SET IDENTITY_INSERT student ON

웹 애플리케이션에서이 오류가 발생하거나 엔티티 프레임 워크를 사용하는 경우 먼저 SQL Server에서이 쿼리를 실행하고 엔티티 모델을.edmx file 업데이트하고 ( ) 프로젝트를 빌드 하면이 오류가 해결됩니다.


EF가있는 MVC 웹 앱의 경우 .edmx에서 모델을 삭제하고 다시 추가 (데이터베이스에서 모델을 마우스 오른쪽 버튼으로 클릭하십시오)하고 프로젝트를 정리하고 다시 빌드 한 다음 저에게 도움이되었습니다. 감사합니다 @Umang Patwa
Ishwor Khanal

42

IDENTITY_INSERT를 ON으로 설정하는 것에 매우주의하십시오. 데이터베이스가 유지 보수 모드에 있고 단일 사용자로 설정되어 있지 않으면 이는 좋지 않은 방법입니다. 이것은 인서트뿐만 아니라 테이블에 액세스하려는 다른 사람들에게도 영향을 미칩니다.

ID 필드에 값을 입력하려고하는 이유는 무엇입니까?


5
어떤 식으로 영향을 받습니까? 이것은 테이블의 특성이 아닌 세션 레벨 옵션입니다.
Martin Smith

5
관계를 유지하려는 두 데이터베이스간에 일회성 데이터 동기화 예를 들어 제품 스키마를 한 데이터베이스에서 다른 데이터베이스로 가져 오는 데 사용했습니다
NSjonas

1
@NSjonas, set Identity _insert table1 ON을 잘 사용합니다. 간단한 삽입으로 수행해야하고 ID가 생성되도록 응용 프로그램에서 무언가를 수행하기 위해 이것을 사용하려는 사람들을 보았습니다.
HLGEM

2
문제는 "무엇을 정의하고 어떻게 해결할 수 있습니까?"입니다. 귀하의 답변은 문제를 해결하는 적절한 답변 대신 경고 및 다른 질문을 제기하는 의견입니다.
품질 촉매

예, 기본 키에 값을 삽입하지 마십시오.
doflamingo

22

기본적으로 오류없이 레코드를 삽입하는 방법에는 두 가지가 있습니다.

1) IDENTITY_INSERT가 OFF로 설정된 경우. 기본 키 "ID"는 없어야합니다.

2) IDENTITY_INSERT가 ON으로 설정된 경우. 기본 키 "ID"가 있어야합니다.

IDENT PRIMARY KEY로 만든 동일한 테이블에서 다음 예제에 따라 :

CREATE TABLE [dbo].[Persons] (    
    ID INT IDENTITY(1,1) PRIMARY KEY,
    LastName VARCHAR(40) NOT NULL,
    FirstName VARCHAR(40)
);

1) 첫 번째 예에서는 IDENTITY_INSERT가 OFF 일 때 오류없이 테이블에 새 레코드를 삽입 할 수 있습니다. 기본 키 "ID" 는 "INSERT INTO"문에 없어야 하며 고유 ID 값이 자동으로 추가됩니다 .. 이 경우 INSERT에서 ID가 있으면 "테이블의 식별 열에 명시적인 값을 삽입 할 수 없습니다 ..."라는 오류가 발생합니다.

SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE'); 
INSERT INTO Persons (FirstName,LastName) 
VALUES ('JOE','BROWN');

표 [dbo]의 출력. [사람]은 다음과 같습니다.

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2) 두 번째 예에서는 IDENTITY_INSERT가 ON 일 때 오류없이 테이블에 새 레코드를 삽입 할 수 있습니다. 기본 키ID 값이 존재하지 않는 "ID" 는 "INSERT INTO"문에 있어야 합니다 .이 경우 ID가 INSERT에 없으면 "명시적인 값은 다음과 같아야합니다. 식별 컬럼 테이블에 지정되었습니다 ... "

SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE'); 
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK'); 

표 [dbo]의 출력. [사람]은 다음과 같습니다.

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN

2
실제로 플래그가 작동하는 방법을 설명하기위한 것입니다. 나의 하루를 구했다 Superman
John

20

해당 테이블의 엔티티에서 DatabaseGenerated ID 삽입이 설정된 열 위에 속성을 .

예:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }

글쎄,하지만 EF에 대한 답을 정말로 원했습니다. :-) 아직도, EF를 사용하지 않았거나 경험하지 못한 OP에게는 적합하지 않습니다.
Auspex

어쨌든 대답은 잘못되었습니다. 내 엔터티가 이미로 지정되어 DatabaseGeneratedOption.Identity있는데 여전히 오류가 발생합니다. 내 자신의 잘못이며, 웹 페이지에서 의사 ID를 서로 구별하기 위해 새 행에 넣고 있습니다 insert.
Auspex

13

예를 들어 테이블 이름이 School 인 경우이 명령문을 간단히 사용할 수 있습니다 . 삽입하기 전에 identity_insert가 ON 으로 설정 되고 쿼리 삽입 후 identity_insert를 끄십시오.

SET IDENTITY_INSERT School ON
/*
  insert query
  enter code here
*/
SET IDENTITY_INSERT School OFF

1
명령에 대한 설명, 명령이 작동하는 이유 및 그 효과에 대한 설명을 포함하여 답변을 약간 확장 할 수 있습니까?
gareththegeek

@gareththegeek은 데이터를 삽입하기 위해 신원 확인 열을 사용해야합니다.

6

liquibase를 사용하여 SQL Server를 업데이트하는 경우 autoIncrement 필드에 레코드 키를 삽입하려고합니다. 삽입에서 열을 제거하면 스크립트가 실행됩니다.

<changeSet id="CREATE_GROUP_TABLE" >
    <createTable tableName="GROUP_D">
        <column name="GROUP_ID" type="INTEGER" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="INSERT_UNKNOWN_GROUP" >
    <insert tableName="GROUP_D">    

        <column name="GROUP_ID" valueNumeric="-1"/>
 ...
    </insert>
</changeSet>

4

쿼리에 미리 언급 된 OperationId가 있으며 자동으로 영향을받지 않으므로 없어야합니다.

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

그래서 당신의 쿼리는

Insert table(OpDescription,FilterID)
values ('Hierachy Update',1)

3

또 다른 상황은 기본 키가 클래스와 동일한 이름 인지 확인하는 것입니다. 단 한 가지 차이점은 기본 키에 'ID'가 추가되었거나 기본 키에 [키]를 지정하는 방법과 다릅니다. 클래스 이름이 지정됩니다.


2
  1. SQL에서 ID가 True로 설정되지 않은 (기본 키) 열이 있고 삽입 중에 명시적인 값을 전달하지 않으면 발생합니다. 첫 번째 행이 걸리고 두 번째 행을 삽입 할 수 없으면 오류가 나타납니다. 이것은 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]PrimaryKey 열에이 코드 줄을 추가하여 수정하고 int 데이터 유형으로 설정했는지 확인하십시오. . 열이 기본 키이고 SQL에서 IsIDentity가 true로 설정된 경우이 코드 줄이 필요하지 않습니다.[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  2. 이는 u가 기본 키가 아닌 열, ID가 true로 설정된 SQL 및 EF에서이 코드 행을 추가하지 않은 경우에도 발생합니다. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

고마워 이것은 iv 찾고있는 시간을 보낸 수정이었습니다.
Vishav Premlall

2

가장 좋은 방법은 사용 주석이다 GeneratedValue(strategy = ...), 즉,

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column ...
private int OperationID;

이 열은 IDENTITY 전략을 사용하여 데이터베이스에 의해 생성되며 관리 할 필요가 없습니다. 데이터베이스가이를 수행합니다.


1

sequelize-typescript npm과 함께 sql-server를 사용하는 동안이 문제가 발생 @AutoIncrement하면 ID 열에 추가하십시오 .

  @PrimaryKey
  @AutoIncrement
  @Column
  id!: number;

0

Oracle SQL Developer를 사용하여 연결하는 경우 / sqldev : stmt /

/ sqldev : stmt / 설정 identity_insert 테이블;


분명히 그렇지 않다. 문제는 "sql-server"태그를 가지고있다
DanielV

0

"표 삽입"의 용도가 확실하지 않지만 일부 값을 삽입하려는 경우 다음을 시도하십시오.

Insert Into [tablename] (OpDescription,FilterID)
values ('Hierachy Update',1);

나는 같은 오류 메시지가 나타 났지만 이것이 효과가 있다고 생각합니다. ID는 기본 키인 경우 자동으로 자동 증가해야합니다.


0

데이터베이스에 아무것도 추가하려고 할 때마다 새 객체를 만들어이 문제를 해결했습니다.


0

당신이 각 라인을 폐쇄하는 경우주의 ;SET IDENTITY_INSERT mytable ON명령이 다음 행에 대한 보유하지 않습니다.


같은 쿼리

SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');

오류를 준다
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

그러나 이와 같은 쿼리는 작동합니다.

SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;

SET IDENTITY_INSERT명령은 트랜잭션에만 해당 되는 것처럼 보이며 트랜잭션 ;의 끝을 나타냅니다.


-1

인터페이스를 사용하고 일반적인 방법으로 저장 변경 방법을 구현하는 경우 유형이 지정되지 않은 DBContext 또는 DBSet을 사용하면 문제가 발생합니다.

이것이 귀하의 경우라면 예를 들어 강력하게 유형이 지정된 DBContex를 제안합니다.

MyDBContext.MyEntity.Add(mynewObject)

그런 다음 .Savechanges작동합니다


-1

.dbml 파일로 끌어온 테이블을 삭제하고 다시 드래그하십시오. 그런 다음 Clean solution> Rebuild solution> Build solution을 청소하십시오.

그게 나를 위해 일한 것입니다.

나는 스스로 테이블을 만들지 않았고 VS와 SSMS를 사용하고 있었고 ASP.NET Identity의 https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/ 링크를 따랐습니다. 빈 상태 또는 기존 웹 양식 프로젝트에 ASP-ID를 추가

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.