Không thể chèn giá trị rõ ràng cho cột danh tính trong bảng 'bảng' khi IDENTITY_INSERT được đặt thành TẮT


361

Tôi có lỗi dưới đây khi tôi thực thi đoạn script sau. Lỗi là gì và làm thế nào để giải quyết nó?

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

Lỗi:

Máy chủ: Msg 544, Cấp 16, Bang 1, Dòng 1

Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng 'bảng' khi IDENTITY_INSERT được đặt thành TẮT.



2
@HimanshuAhuja Câu hỏi này (1334012) đã được 10 tuổi, câu hỏi bạn chỉ liên kết 1. Nếu có bất cứ điều gì, thì cái mới hơn là một bản sao. Nhưng nhìn kỹ hơn, bạn sẽ thấy chúng khác nhau (cái mới hơn chỉ định IDENTITY_INSERT là ON). Vui lòng xóa cờ / bình luận của bạn.
jasie

@jasie sẽ làm điều đó vì tôi không nhớ khi tôi đã đăng lá cờ này
Himanshu Ahuja

Câu trả lời:


467

Bạn đang chèn các giá trị cho OperationIdđó là một cột danh tính.

Bạn có thể bật chèn nhận dạng trên bảng như thế này để bạn có thể chỉ định các giá trị nhận dạng của riêng bạn.

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 chính xác - bật tùy chọn để cho phép chèn rõ ràng ON , sau đó chèn, sau đó bật tùy chọn OFF một lần nữa
marc_s

13
Nếu bạn thực sự muốn thêm giá trị của mình vào cột danh tính, đây là câu trả lời của bạn, nhưng mặt khác, ai đó đã đặt cột sẽ tự tăng lên khi chèn. Trong trường hợp đó, bảng sẽ theo dõi số miễn phí tiếp theo và bạn không cần phải tự tạo hoạt động. Id mới có thể được tìm nạp bởi SELECT SCOPE_IDENTITY ().
Hakan Winther

15
Thực hành nguy hiểm, không khuyên bạn nên sử dụng nó mà không cẩn thận cho biết tại sao đó là một ý tưởng kém. Câu trả lời rất kém.
HLGEM

7
câu trả lời tốt, nhưng hãy chắc chắn rằng bạn biết những gì bạn đang làm. Đối với tôi thật hữu ích khi chọn một cơ sở dữ liệu với dữ liệu trong đó các khóa ngoại cần khớp với các bảng khác nhau
Berty

2
@UlyssesAlves: tùy chọn này chỉ có thể được bật cho một bảng toàn cơ sở dữ liệu - vì vậy nếu bạn để nó trên một bảng, bạn sẽ không thể sử dụng nó cho một bảng khác. Ngoài ra: đó không phải là một tùy chọn nên được để lại - theo mặc định, bạn nên để SQL Server xử lý các giá trị nhận dạng - đây chỉ nhằm mục đích là biện pháp cuối cùng cho các trường hợp rất cụ thể - không phải là tùy chọn có mục đích chung để tắt hoặc tắt giải trí của bạn ...
marc_s

61

không đặt giá trị cho OperationID vì nó sẽ được tạo tự động. thử cái này:

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

5
đây là câu trả lời đúng nếu bạn muốn tự động tạo OperationID
shaijut

46

Đơn giản là nếu bạn gặp lỗi này trên máy chủ SQL thì hãy chạy truy vấn này-

SET IDENTITY_INSERT tableName ON

đây chỉ hoạt động với một bảng dữ liệu, ví dụ: Nếu tên bảng là sinh viên thì truy vấn trông như thế này SET IDENTITY_INSERT student ON

Nếu bạn gặp lỗi này trên ứng dụng web hoặc bạn sử dụng khung thực thể thì trước tiên hãy chạy truy vấn này trên máy chủ SQL và Cập nhật mô hình thực thể.edmx file của bạn ( ) và xây dựng dự án của bạn và lỗi này sẽ được giải quyết


Đó là trường hợp trong ứng dụng web MVC của tôi với EF và tôi vừa xóa mô hình khỏi .edmx và thêm lại (Mô hình cập nhật nhấp chuột phải từ cơ sở dữ liệu) và dọn dẹp và xây dựng lại dự án mà sau đó làm việc cho tôi. Cảm ơn bạn @Umang Patwa
Ishwor Khanal

42

Hãy cảnh giác khi đặt IDENTITY_INSERT thành ON. Đây là một thực tiễn kém trừ khi cơ sở dữ liệu ở chế độ bảo trì và được đặt thành một người dùng. Điều này ảnh hưởng đến không chỉ người chèn của bạn, mà cả những người khác đang cố truy cập vào bảng.

Tại sao bạn cố gắng đưa một giá trị vào một trường danh tính?


5
Ảnh hưởng theo cách nào? Đây là một tùy chọn cấp phiên không phải là một thuộc tính của bảng.
Martin Smith

5
Đồng bộ dữ liệu một lần giữa hai cơ sở dữ liệu mà bạn muốn duy trì mối quan hệ. Ví dụ: tôi đã sử dụng nó để kéo lược đồ sản phẩm của mình từ cơ sở dữ liệu này sang cơ sở dữ liệu khác
NSjonas

1
@NSjonas, đó sẽ là một cách sử dụng tốt bộ Setity _insert bảng1 ON. Tôi đã thấy những người muốn sử dụng điều này để làm một cái gì đó từ ứng dụng nên được thực hiện với một thao tác chèn đơn giản và cho phép nhận dạng được tạo.
HLGEM

2
Câu hỏi là "Bạn có thể chỉ định nó là gì và làm thế nào để giải quyết nó?" Câu trả lời của bạn là một bình luận đưa ra cảnh báo và một câu hỏi khác thay vì một câu trả lời thích hợp giải quyết vấn đề.
Chất xúc tác chất lượng

yeah không chèn giá trị trong khóa chính.
doflamingo

22

Về cơ bản, có 2 cách khác nhau để ghi lại hồ sơ mà không gặp lỗi:

1) Khi IDENTITY_INSERT được đặt TẮT. "ID" CHÍNH HÃNG KHÔNG ĐƯỢC HIỆN TẠI

2) Khi IDENTITY_INSERT được đặt thành BẬT. "ID" CHÍNH HÃNG PHẢI HIỆN TẠI

Theo ví dụ sau từ cùng một Bảng được tạo với một KHÓA CHÍNH XÁC NHẬN:

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

1) Trong ví dụ đầu tiên, bạn có thể chèn các bản ghi mới vào bảng mà không gặp lỗi khi IDENTITY_INSERT TẮT. "ID" CHÍNH HÃNG KHÔNG ĐƯỢC HIỆN TẠI từ Tuyên bố "XÁC NHẬN VÀO" và một giá trị ID duy nhất sẽ được thêm tự động : . Nếu ID có mặt từ INSERT trong trường hợp này, bạn sẽ gặp lỗi "Không thể chèn giá trị rõ ràng cho cột xác định trong bảng ..."

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

ĐẦU RA BẢNG [dbo]. [Người] sẽ là:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2) Trong ví dụ thứ hai, bạn có thể chèn các bản ghi mới vào bảng mà không gặp lỗi khi IDENTITY_INSERT được BẬT. ID "ID" CHÍNH HÃNG PHẢI ĐƯỢC HIỆN TẠI từ Tuyên bố "INSERT INTO" miễn là giá trị ID chưa tồn tại : Nếu ID KHÔNG xuất hiện từ INSERT trong trường hợp này, bạn sẽ nhận được lỗi "Giá trị rõ ràng phải là được chỉ định cho bảng cột nhận dạng ... "

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'); 

ĐẦU RA BẢNG [dbo]. [Người] sẽ là:

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

2
Thêm một cho thực sự Giải thích làm thế nào cờ hoạt động. Cứu lấy ngày của tôi Siêu nhân
John

20

Trong thực thể của bạn cho bảng đó, hãy thêm DatabaseGeneratedthuộc tính phía trên cột cho phép chèn danh tính:

Thí dụ:

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

Chà, đúng, nhưng tôi thực sự muốn có câu trả lời cho EF :-) Tuy nhiên, nó không phù hợp với OP, người có thể chưa bao giờ sử dụng, hoặc thậm chí có thể gặp phải, EF.
Auspex

Trong mọi trường hợp, câu trả lời là sai. Thực thể của tôi đã được chỉ định DatabaseGeneratedOption.Identityvà tôi vẫn gặp lỗi. Đó là lỗi của riêng tôi, tôi đặt ID giả trong các hàng mới để phân biệt chúng với nhau trên trang web của mình và tôi hy vọng chỉ cần vô hiệu hóa chúng trước khi insertđủ.
Auspex

13

bạn chỉ có thể sử dụng Tuyên bố này ví dụ nếu tên bảng của bạn là Trường học . Trước khi chèn, hãy đảm bảo nhận dạng ID_insert được đặt thành BẬT và sau khi chèn truy vấn, hãy bật ID_insert TẮT

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

1
Bạn có thể mở rộng câu trả lời của mình một chút để đưa ra lời giải thích về lệnh, tại sao nó hoạt động và nó có tác dụng gì không?
gareththegeek

@gareththegeek có cho cột nhận dạng, bạn phải đảm bảo bật nó lên để chèn dữ liệu.

6

Nếu bạn đang sử dụng liquidibase để cập nhật Máy chủ SQL của mình, có khả năng bạn đang cố gắng chèn khóa bản ghi vào trường tự động. Bằng cách xóa cột khỏi chèn, tập lệnh của bạn sẽ chạy.

<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

Có một ActivityId được đề cập trước trong truy vấn của bạn không nên ở đó vì nó được tự động tăng cường

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

vì vậy truy vấn của bạn sẽ là

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

3

Một tình huống khác là kiểm tra xem Khóa chính có cùng tên với các lớp của bạn không, điểm khác biệt duy nhất là khóa chính của bạn có 'ID' được gắn vào nó hoặc chỉ định [Khóa] trên các khóa chính không liên quan đến cách lớp được đặt tên.


2
  1. Điều này xảy ra khi bạn có một cột (Khóa chính) không được đặt thành Nhận dạng thành đúng trong SQL và bạn không chuyển giá trị rõ ràng trong khi chèn. Nó sẽ mất hàng đầu tiên, sau đó bạn sẽ không thể chèn hàng thứ hai, lỗi sẽ bật lên. Điều này có thể được sửa chữa bằng cách thêm dòng mã này [DatabaseGenerated(DatabaseGeneratedOption.Identity)]vào cột Chính của bạn và đảm bảo rằng nó được đặt thành kiểu dữ liệu int . Nếu cột là khóa chính và được đặt thành IsIDentity thành true trong SQL thì không cần dòng mã này[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  2. điều này cũng xảy ra khi bạn có một cột không phải là khóa chính, trong SQL được đặt thành Is Identity thành true và trong EF của bạn, bạn không thêm dòng mã này [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Cảm ơn đây là bản sửa lỗi iv đã dành hàng giờ để tìm kiếm.
Vishav Premlall

2

Giải pháp tốt nhất là sử dụng chú thích GeneratedValue(strategy = ...), tức là

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

nó nói rằng cột này được tạo bởi cơ sở dữ liệu bằng chiến lược IDENTITY và bạn không cần phải quan tâm - cơ sở dữ liệu sẽ làm điều đó.


1

Nếu bạn gặp vấn đề này trong khi sử dụng máy chủ sql với npm sequelize-typecript, hãy đảm bảo thêm @AutoIncrementvào cột ID:

  @PrimaryKey
  @AutoIncrement
  @Column
  id!: number;

0

Và nếu bạn đang sử dụng Oracle SQL Developer để kết nối, hãy nhớ thêm / sqldev: stmt /

/ sqldev: stmt / set id_insert BẢNG trên;


Rõ ràng đây không phải là trường hợp, câu hỏi có thẻ "sql-server"
DanielV 17/03/2016

0

Tôi không chắc việc sử dụng cho "Bảng chèn" là gì, nhưng nếu bạn chỉ cố gắng chèn một số giá trị, hãy thử:

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

Tôi đã có thông báo lỗi tương tự, nhưng tôi nghĩ nó sẽ hoạt động. ID sẽ tự động tăng tự động miễn là khóa chính.


0

Tôi đã giải quyết vấn đề này bằng cách tạo một đối tượng mới mỗi lần tôi muốn thêm bất cứ thứ gì vào cơ sở dữ liệu.


0

Lưu ý rằng nếu bạn đang đóng từng dòng với ;, SET IDENTITY_INSERT mytable ONlệnh sẽ không giữ cho các dòng sau.

tức là
một truy vấn như

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

Đưa ra lỗi
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

Nhưng một truy vấn như thế này sẽ hoạt động:

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

Có vẻ như SET IDENTITY_INSERTlệnh chỉ giữ cho một giao dịch và ý ;chí sẽ biểu thị sự kết thúc của một giao dịch.


-1

Vấn đề nảy sinh từ việc sử dụng DBContext hoặc DBset không được gõ nếu bạn sử dụng Giao diện và phương thức thực hiện savechanges theo cách chung

Nếu đây là trường hợp của bạn, tôi đề nghị gõ mạnh vào DBContex chẳng hạn

MyDBContext.MyEntity.Add(mynewObject)

sau đó .Savechangessẽ làm việc


-1

Chỉ cần xóa các bảng được kéo vào tệp .dbml của bạn và kéo lại chúng một lần nữa. Sau đó, giải pháp Clean> Rebuild Solution> Build Solution.

Đó là những gì làm việc cho tôi.

Tôi không tự tạo bảng, tôi đang sử dụng VS và SSMS, tôi đã theo liên kết này để nhận dạng ASP.NET: https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/ thêm-aspnet-nhận dạng-vào-một-trống-hoặc-tồn tại-web-Forms-dự án

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.