close

Infoga (SQL)

Gå till navigering Gå till sök

INSERT  är en SQL-sats som låter dig lägga till rader i en tabell genom att fylla dem med värden. Värden kan infogas genom uppräkning med hjälp av ordvärdena och räknas upp inom parentes, separerade med kommatecken, eller genom att använda select- satsen .

Användningsexempel

Använd en uppräkning av värden och ange kolumner:

infoga  i  < tabellnamn  > ([ < Kolumnnamn > , ... ]) värden ( < Värde > , ... )      

Till exempel:

INSERT  INTO  phone_book  ( namn ,  nummer )  VÄRDEN  ( 'John Doe' ,  '555-1212' );

Använda en uppräkning av värden, utan att ange kolumner:

infoga  i  < tabellnamn  > värden ( < värde >  , ...) 

Till exempel:

INSERT  INTO  phone_book  VALUES  ( 'John Doe' ,  '555-1212' );

Använda välj:

infoga  i  < tabellnamn  > välj < kolumnnamn > , ... från < tabellnamn > _ _      

I det senare fallet kan mer än en post infogas i tabellen. Om det finns andra fält i tabellen som behöver fyllas i men som inte anges i insert-satsen, kommer de att ställas in på standardvärdet, eller null om inget standardvärde anges.

Alternativ syntax för INSERT-satsen

Vissa DBMS, som MySQL, har en alternativ syntax för INSERT-satsen, där värden tilldelas kolumner med nyckelordet SET:

infoga  i  < tabellnamn  > set < kolumnnamn 1 > = < värde 1 > , < kolumnnamn 2 > = < värde 2 > ... _ _ _         

Funktioner

Under körningen av uttalandet kan fel uppstå:

  • om fältet skapades med parametern not null och inget standardvärde angavs (se skapa ), kommer ett fel att uppstå om det inte finns något insättningsbart värde för det. Lösningen är uppenbar:
    • eller ta bort parametern not null
    • eller ange ett standardvärde
    • eller infoga värde
  • om det görs ett försök att infoga i ett fält med typidentitet (autoinkrement), kommer även ett fel att uppstå. Det finns två sätt att lösa problemet:
    • infoga inte ett värde i det här fältet
    • ange alternativet identity_insert on och infoga sedan ett unikt värde för denna kolumn

identity_insert option (MS SQL Server)

detta uttalande kommer inte att fungera, du måste ange tabellnamnet.

Aktivera alternativ:

 SET  IDENTITY_INSERT  tabell  {   |  AV  }

Efter att ha aktiverat det här alternativet kan du infoga värden i fält som definieras som identitet. Observera att värdet måste vara unikt.

Att aktivera detta alternativ utan ett tydligt behov rekommenderas inte. Det bör dock användas i poster där vissa kolumner behöver ändras utan att ändra dess identitetskolumn (till exempel om denna kolumn är länkad till en annan tabell)

Få nyckeln

Utvecklare som använder en surrogatnyckel som primärnyckel stöter ofta på ett scenario där de behöver få primärnyckeln (för användning i andra frågor) genererad av databasen som svar på en SQL INSERT-sats. Men de flesta system tillåter inte SQL INSERT-satsen att returnera data. Möjliga lösningar:

  • Använd en databasspecifik lagrad procedur som genererar en surrogatnyckel, utför en INSERT-operation och returnerar den genererade nyckeln. Till exempel, i Microsoft SQL Server returneras nyckeln av specialfunktionen SCOPE_IDENTITY() och i SQLite av funktionen last_insert_rowid().
  • Använd en databasspecifik SELECT -operation på en temporär tabell som innehåller den senast tillagda raden (eller raderna). DB2 implementerar den här funktionen enligt följande:
VÄLJ  * 
FRÅN  SLUTTABELLEN  ( INFOGA  I VÄRDEN I telefonboken ( 'Peter Doe' , '555-2323' ) ) SOM t          
DB2 för z/OS implementerar denna funktion enligt följande:
VÄLJ  EMPNO ,  HIRETYPE ,  HIREDATE  
FRÅN  SLUTTABELLEN  ( INFOGA  I EMPSAMP ( NAMN , LÖN , DEPTNO , LEVEL ) VÄRDEN ( ' Mary Smith ' , 35000 . 00 , 11 , ' Associate ' ) );           
  • Genom att använda en SELECT-sats efter en INSERT-sats, med en speciell funktion som, i en given databas, returnerar den genererade primärnyckeln för den senast tillagda raden.
  • Genom att använda den unika kombinationen av fält som ingick i den ursprungliga SQL INSERT-satsen i efterföljande anrop till SELECT-satsen .
  • Använd GUID i en SQL INSERT-sats, få resultatet genom en SELECT-sats .
  • Genom att använda MySQL mysql_insert_id() PHP -funktionen efter INSERT-satsen.
  • använder INSERT följt av SELECT LAST_INSERT_ID() för MySQL .
  • Använder INSERT-satsen med en OUTPUT-sats (Transact-SQL) sedan Microsoft SQL Server 2005 .
DECLARE  @ table  TABELL  ( 
	[ id ]  [ smallint ]  IDENTITET ( 1 , 1 )  INTE  NULL , 
	[ namn ]  [ nchar ]( 50 )  NULL );
 
INSERT  INTO  @ table 
    OUTPUT  INSERT . id 
VALUES  ( 'Peter Doe' );
  • Använda INSERT-satsen med RETURNING-modifieraren för PostgreSQL (från version 8.2) och Firebird (från version 2.0 ). Den returnerade listan är identisk med resultatet av SELECT-satsen.
INSERT  I  phone_book  VALUES  (  'Peter Doe' , '555-2323'  ) 
RETURNING  phone_book_id
  • Använda INSERT-satsen med RETURNING-modifieraren för Oracle . Samma syntax används i Firebird för procedurer, triggers och exekveringsblock.
INSERT  I  phone_book  VALUES  (  'Peter Doe' , '555-2323'  ) 
TILLBAKA  phone_book_id  INTO  v_pb_id
  • Funktionen IDENTITY() i H2 returnerar den senast tillagda (nyckel?)
VÄLJ  IDENTITET ();

Se även