Kan geen expliciete waarde invoegen voor identiteitskolom in tabel ‘tabel’ wanneer IDENTITY_INSERT is ingesteld op UIT

Ik krijg de onderstaande foutmelding wanneer ik het volgende script uitvoer. Waar gaat de fout over en hoe kan deze worden opgelost?

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

Fout:

Server: Msg 544, Niveau 16, Staat 1, Lijn 1

Kan geen expliciete waarde voor identiteitskolom in tabel ‘tabel’ invoegen wanneer IDENTITY_INSERT is ingesteld op UIT.


Antwoord 1, autoriteit 100%

U voegt waarden in voor OperationIddat een identiteitskolom is.

Je kunt het invoegen van identiteit in de tabel op deze manier inschakelen, zodat je je eigen identiteitswaarden kunt specificeren.

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 

Antwoord 2, autoriteit 13%

geef geen waarde aan OperationID omdat deze automatisch wordt gegenereerd. probeer dit:

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

Antwoord 3, autoriteit 12%

Als u deze fout op de SQL-server krijgt, voer dan deze query uit-

SET IDENTITY_INSERT tableName ON

Dit werkt alleen voor een enkele databasetabel
E.G Als de tabelnaam studentvervolgens als volgt uitzien:

SET IDENTITY_INSERT student ON

Als u deze foutmelding op uw webtoepassing krijgt of u entiteitsramework gebruikt, voert u deze query eerst uit op SQL Server en update uw Entity Model (.edmx file) Bouw je project en deze fout wordt opgelost


4, Autoriteit 8%

Wees zeer op hun hoede om identiteit_insert aan te staan. Dit is een slechte praktijk tenzij de database in de onderhoudsmodus staat en ingesteld op een enkele gebruiker. Dit beïnvloedt niet alleen uw inzetstuk, maar die van iedereen die probeert toegang te krijgen tot de tabel.

Waarom probeer je een waarde in een identiteitsveld te plaatsen?


5, Autoriteit 4%

Voeg in uw entiteit voor die tabel de DatabaseGeneratedAttribuut boven de kolom toe waarvoor identiteitsinzetstuk is ingesteld:

Voorbeeld:

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

6, Autoriteit 4%

Er zijn eigenlijk 2 verschillende manieren om records in te voegen zonder een foutmelding te hebben:

1) Wanneer de identiteit_inert is uitgeschakeld. De primaire sleutel “ID” mag niet aanwezig zijn

2) Wanneer de identiteit_insert is ingesteld. De primaire sleutel “ID” moet aanwezig zijn

Vanaf het volgende voorbeeld van dezelfde tabel met een primaire tabel met een identiteit:

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

1) In het eerste voorbeeld kunt u nieuwe records in de tabel invoegen zonder een foutmelding te krijgen wanneer de identiteit_insert uit is. De primaire sleutel “ID” mag niet aanwezig zijn van het “Invoegen in” -aanduidingen en een unieke ID-waarde wordt automatisch toegevoegd: . Als de ID in dit geval van het inzetstuk aanwezig is, krijgt u de foutmelding “Kan de expliciete waarde niet invoegen voor het identificeren van kolom in de tabel …”

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

Output of Table [DBO]. [Personen] Wordt:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2) In het tweede voorbeeld kunt u nieuwe records in de tabel invoegen zonder een foutmelding te krijgen wanneer de identiteit_insert is ingeschakeld. De primaire sleutel “ID” moet aanwezig zijn van het “Invoegen in” -aanduidingen zolang de ID-waarde nog niet bestaat : als de ID niet aanwezig is in het inzetstuk In dit geval krijgt u de foutmelding “Expliciete waarde moet worden opgegeven voor identiteitskolomtafel …”

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

Output of Table [DBO]. [Personen] Wordt:

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

7, Autoriteit 2%

U kunt deze verklaring eenvoudig gebruiken als uw tabelnaam school is.
Vóór Insertion zorgt ervoor dat Identity_insert is ingesteld op op en na het invoegen van query Turn Identity_insert Off

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

8, Autoriteit 2%

Merk op dat als u elke regel sluit met ;, de SET IDENTITY_INSERT mytable ON-opdracht niet voor de volgende regels.

i.e.
een query zoals

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

geeft de fout
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

Maar een query zoals dit zal werken:

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

Het lijkt alsof de SET IDENTITY_INSERT-opdracht alleen geldt voor een transactie en de ;zal het einde van een transactie betekenen.


9

Als u Liquibase gebruikt om uw SQL Server bij te werken, probeert u waarschijnlijk een recordsleutel in een automatisch incrementveld in te voegen. Door de kolom uit het inzetstuk te verwijderen, moet uw script worden uitgevoerd.

<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>

Antwoord 10

Er is een eerder genoemde OperationId in uw zoekopdracht die er niet zou moeten zijn omdat deze automatisch wordt verhoogd

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

dus uw vraag wordt

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

Antwoord 11

iedereen geeft commentaar op SQL, maar wat is er gebeurd in EntityFramework? Ik heb het hele bericht gelezen en niemand heeft EF opgelost. Dus na een paar dagen een gevonden oplossing:
EF Core in de context om het model te maken is er een instructie zoals deze:modelBuilder.Entity<Cliente>(entity => { entity.Property(e => e.Id).ValueGeneratedNever();

dit levert ook de fout op, oplossing: je moet veranderen door ValueGeneratedOnAdd() en zijn werken!


Antwoord 12

Een andere situatie is om te controleren of de primaire sleutel dezelfde naamheeft als bij uw klassen, waarbij het enige verschil is dat er een ‘ID’ aan uw primaire sleutel is toegevoegd, of om [Sleutel] op te geven op primaire sleutels die niet gerelateerd zijn aan de naam van de klasse.


Antwoord 13

  1. Dit gebeurt wanneer u een (primaire sleutel) kolom hebt die niet is ingesteld op de identiteit van TRUE in SQL en u tijdens het insert geen expliciete waarde daarvan passeert. Het zal de eerste rij nemen, dan kan je de tweede rij niet invoegen, de fout verschijnt. Dit kan worden gecorrigeerd door deze regel van code toe te voegen [DatabaseGenerated(DatabaseGeneratedOption.Identity)]in uw Kolom in het Priminee en zorg ervoor dat de ingesteld is op een gegevenstype Int . Als de kolom de primaire sleutel is en is ingesteld op de isidentiteit om in SQL te zijn, is het niet nodig aan deze regel code [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  2. Dit gebeurt ook wanneer u een kolom heeft die niet de primaire sleutel is, in SQL die is ingesteld op Identity to True, en in uw EF voegt u deze regelnummer [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

14

Als u dit probleem hebt bij het gebruik van een SQL-Server met het Sequelize-typescript NPM Zorg ervoor dat u @AutoIncrementAAN ID-kolom toevoegen:

 @PrimaryKey
  @AutoIncrement
  @Column
  id!: number;

15

In mijn geval had ik een andere accommodatie als sleutel in de context voor mijn modelbouw. ​​

modelBuilder.Entity<MyTable>().HasKey(t => t.OtherProp);

Ik moest de juiste id instellen

modelBuilder.Entity<MyTable>().HasKey(t => t.Id);

Antwoord 16

En als u Oracle SQL Developer gebruikt om verbinding te maken, vergeet dan niet om /sqldev:stmt/

toe te voegen

/sqldev:stmt/ stel identity_insert TABLE in op;


Antwoord 17

Ik weet niet zeker wat het gebruik van de “Tabel invoegen” is, maar als je alleen wat waarden probeert in te voegen, probeer dan:

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

Ik kreeg dezelfde foutmelding, maar ik denk dat dit zou moeten werken. De ID moet automatisch worden verhoogd zolang het een primaire sleutel is.


Antwoord 18

Ik heb dit probleem opgelost door elke keer als ik iets aan de database wil toevoegen een nieuw object te maken.


Antwoord 19

In mijn CASE was ik meer tekens aan het invoegen dan gedefinieerd in de tabel.

In Mijn tabel was de kolom gedefinieerd met nvarchar(3)en ik gaf meer dan 3 tekensdoor en hetzelfde bericht ERRORkwam eraan.

Het is geen antwoord, maar in sommige gevallen is het probleem vergelijkbaar


Antwoord 20

ik gebruik asp.net core 5.0 en ik krijg die fout. ik krijg die fout omdat ik andere gegevens aan het toevoegen was en de andere methode .SaveChanges()activeerde, zoals hieronder:

_unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
 int request = HttpContext.Response.StatusCode;
 if (request == 200)
 {
     int tryCatch = _unitOfWorkCVar.Complete();
     if (tryCatch != 0)
     {
         productVariant.CategoryVariantID = variantValue.CategoryVariantID;
         productVariant.ProductID = variantValue.ProductID;
         productVariant.CreatedDate = DateTime.Now;
         _unitOfWorkProductVariant.RepositoryProductVariant.Create(productVariant);
         _unitOfWorkVval.RepositoryVariantValue.Create(variantValue);
         int request2 = HttpContext.Response.StatusCode;
         if(request==200)
         {
             int tryCatch2=_unitOfWorkProductVariant.Complete();//The point where i get that error
         }///.......

Antwoord 21

Het probleem dat zich voordeed bij het gebruik van niet-getypte DBContext of DBSet als je Interface gebruikt en de methode voor het opslaan van wijzigingen op een generieke manier implementeert

Als dit uw geval is, stel ik voor om bijvoorbeeld sterk DBContex te typen

MyDBContext.MyEntity.Add(mynewObject)

dan zal .Savechangeswerken


Antwoord 22

Verwijder eenvoudig de tabellen die naar uw .dbml-bestand zijn gesleept en versleep ze opnieuw. Dan Clean solution>Rebuild solution> Oplossing bouwen.

Dat is wat voor mij werkte.

Ik heb de tabel niet zelf gemaakt, ik gebruikte VS en SSMS, ik volgde deze link voor ASP.NET Identity:https://docs.microsoft.com/en-us /aspnet/identity/overview/aan de slag/aspnet-identity-toevoegen aan-een-leeg-of-bestaand-web-formulieren-project

Other episodes