Występuje następujący błąd podczas wykonywania następującego skryptu. Na czym polega błąd i jak go rozwiązać?
Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)
Błąd:
Serwer: Msg 544, poziom 16, stan 1, wiersz 1
Nie można wstawić wyraźnej wartości dla kolumny tożsamości w tabeli „table”, gdy IDENTITY_INSERT jest ustawiony na OFF.
sql
sql-server
sybase
Martin Clayton
źródło
źródło
Odpowiedzi:
Wstawiasz wartości,
OperationId
ponieważ jest to kolumna tożsamości.Możesz włączyć wstawianie tożsamości w tabeli w ten sposób, aby określić własne wartości tożsamości.
źródło
nie przypisuj wartości do OperationID, ponieważ zostanie on wygenerowany automatycznie. Spróbuj tego:
źródło
działa tylko jedna tabela danych, np. jeśli nazwa tabeli to student, zapytanie wygląda następująco
SET IDENTITY_INSERT student ON
źródło
Zachowaj ostrożność przy ustawianiu IDENTITY_INSERT na ON. Jest to zła praktyka, chyba że baza danych znajduje się w trybie konserwacji i nie jest ustawiona na jednego użytkownika. Wpływa to nie tylko na twoją wstawkę, ale także na wszystkich, którzy próbują uzyskać dostęp do tabeli.
Dlaczego próbujesz umieścić wartość w polu tożsamości?
źródło
Istnieją zasadniczo 2 różne sposoby WSTAWIANIA rekordów bez błędu:
1) Gdy IDENTITY_INSERT jest ustawiony na OFF. KLUCZ PODSTAWOWY „ID” NIE MOŻE BYĆ OBECNY
2) Gdy IDENTITY_INSERT jest włączony. KLUCZ PODSTAWOWY „ID” MUSI BYĆ OBECNY
Zgodnie z poniższym przykładem z tej samej tabeli utworzonej przy użyciu klucza podstawowego tożsamości:
1) W pierwszym przykładzie możesz wstawić nowe rekordy do tabeli bez wyświetlania błędu, gdy IDENTITY_INSERT jest WYŁĄCZONY. Klucz podstawowy „ID” nie może być obecny ze sprawozdania „insert into” i unikalna wartość ID zostanie dodany automatycznie: . Jeśli w tym przypadku jest obecny identyfikator z INSERT, pojawi się błąd „Nie można wstawić wyraźnej wartości dla kolumny identyfikacyjnej w tabeli ...”
WYNIK TABELI [dbo]. [Osoby] to:
2) W drugim przykładzie możesz wstawić nowe rekordy do tabeli bez wyświetlania błędu, gdy IDENTITY_INSERT jest włączony. KLUCZ PODSTAWOWY „ID” MUSI BYĆ OBECNY w instrukcjach „INSERT INTO”, o ile wartość ID jeszcze nie istnieje : Jeśli w tym przypadku identyfikator NIE jest obecny w INSERT, pojawi się błąd „Wartość jawna musi być określono dla tabeli kolumn tożsamości ... ”
WYNIK TABELI [dbo]. [Osoby] to:
źródło
W swojej encji dla tej tabeli dodaj
DatabaseGenerated
atrybut nad kolumną, dla której ustawiono wstawianie tożsamości:Przykład:
źródło
DatabaseGeneratedOption.Identity
i nadal pojawia się błąd. To moja wina, że umieszczam pseudo-identyfikatory w nowych wierszach, aby odróżnić je od siebie na mojej stronie internetowej, i mam nadzieję, że po prostu je wyzeruję, zaniminsert
będzie wystarczające.możesz po prostu użyć tego oświadczenia, na przykład, jeśli nazwa twojej tabeli to School . Przed włożeniem make pewien IDENTITY_INSERT jest ustawiony na ON i po insert zapytań kolej IDENTITY_INSERT OFF
źródło
Jeśli używasz Liquibase do aktualizacji SQL Server, prawdopodobnie próbujesz wstawić klucz rekordu w polu autoIncrement. Po usunięciu kolumny ze wstawki skrypt powinien zostać uruchomiony.
źródło
W zapytaniu znajduje się wcześniej wspomniana operacja, której nie powinno być, ponieważ jest ona automatycznie zwiększana
więc twoje zapytanie będzie
źródło
Inną sytuacją jest sprawdzenie, czy klucz podstawowy ma taką samą nazwę jak w przypadku klas, gdzie jedyną różnicą jest to, że klucz podstawowy ma dołączony „identyfikator” lub określenie [klucza] na kluczach podstawowych, które nie są związane ze sposobem klasa ma nazwę.
źródło
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
w kolumnie PrimaryKey i upewnij się, że jest ustawiony na typ danych int . Jeśli kolumna jest kluczem podstawowym i dla SQL ustawiona jest wartość IsIDentity na true, nie ma potrzeby stosowania tego wiersza kodu[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
źródło
Najlepszym rozwiązaniem jest użycie adnotacji
GeneratedValue(strategy = ...)
, tjmówi, że ta kolumna jest generowana przez bazę danych przy użyciu strategii TOŻSAMOŚCI i nie musisz się tym zajmować - baza danych to zrobi.
źródło
Jeśli masz ten problem podczas korzystania z serwera SQL z npm sequelize-maszynopisu, dodaj
@AutoIncrement
kolumnę identyfikatora:źródło
A jeśli używasz Oracle SQL Developer do łączenia, pamiętaj, aby dodać / sqldev: stmt /
/ sqldev: stmt / set TABELA_własności na;
źródło
Nie jestem pewien, do czego służy „Wstaw tabelę”, ale jeśli próbujesz tylko wstawić niektóre wartości, spróbuj:
Pojawił się ten sam komunikat o błędzie, ale myślę, że to powinno zadziałać. Identyfikator powinien automatycznie zwiększać automatycznie, o ile jest to klucz podstawowy.
źródło
Rozwiązałem ten problem, tworząc nowy obiekt za każdym razem, gdy chcę coś dodać do bazy danych.
źródło
Zauważ, że jeśli zamykasz każdą linię
;
,SET IDENTITY_INSERT mytable ON
polecenie nie zostanie wstrzymane dla następujących linii.tj.
zapytanie podobne
Podaje błąd
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.
Ale takie zapytanie będzie działać:
Wygląda na to, że
SET IDENTITY_INSERT
polecenie dotyczy tylko transakcji i;
będzie oznaczać koniec transakcji.źródło
Problem wynikający z używania nietypowego DBContext lub DBSet, jeśli używasz interfejsu i implementujesz metodę zapisywania zmian w sposób ogólny
Jeśli tak jest w twoim przypadku, proponuję na przykład mocno wpisać DBContex
wtedy
.Savechanges
będzie działaćźródło
Po prostu usuń tabele przeciągnięte do pliku .dbml i ponownie przeciągnij je ponownie. Następnie Wyczyść rozwiązanie> Przebuduj rozwiązanie> Kompiluj rozwiązanie.
To działało dla mnie.
Nie zrobiłem tabeli na własną rękę, korzystałem z VS i SSMS, podążałem za tym linkiem do tożsamości ASP.NET: https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/ dodanie-aspnet-tożsamość-do-pustego-lub-istniejącego-formularza-projektu
źródło