Infoga i vald oracle-syntax. Grunderna i T-SQL. DML. Infogar flera rader

Förutom SELECT-satsen som diskuterats tidigare, innehåller Data Manipulation Language (DML) tre andra satser: INSERT, UPDATE och DELETE. Liksom SELECT-satsen fungerar dessa tre satser på antingen tabeller eller vyer. Den här artikeln diskuterar INSERT-satsen, och de andra två satserna diskuteras i nästa artikel.

INSERT-sats infogar rader (eller delar av rader) i en tabell. Det finns två olika former av denna instruktion:

INSERT tab_name [(col_list)] STANDARDVÄRDEN | VÄRDEN (( STANDARD | NULL | uttryck ) [ ,...n]) INSERT INTO tab_name | view_name [(col_list)] (select_statement | execute_statement) Syntaxkonventioner

Den första formen av instruktionen låter dig infoga en rad (eller en del av den) i tabellen. Och den andra formen av INSERT-satsen låter dig infoga i en tabell resultatuppsättningen av en SELECT-sats eller en lagrad procedur som exekveras av en EXECUTE-sats. Den lagrade proceduren måste returnera data som ska infogas i tabellen. När den används med en INSERT-sats kan en SELECT-sats välja värden från en annan eller samma tabell som data infogas i, så länge som datatyperna för motsvarande kolumner är kompatibla.

För båda formulären måste datatypen för varje infogat värde vara kompatibel med datatypen för motsvarande tabellkolumn. Alla strängar och temporära data måste omges av citattecken; Numeriska värden behöver inte stå inom citattecken.

Infoga en enda rad

För båda formerna av INSERT-satsen är det valfritt att uttryckligen ange kolumnlistan. Att inte lista kolumner är detsamma som att ange alla kolumner i tabellen.

DEFAULT VALUES parameter infogar standardvärden för alla kolumner. Kolumner med datatypen TIMESTAMP eller IDENTITY-egenskapen infogas som standard med värden som genereras automatiskt av systemet. För kolumner med andra datatyper infogas motsvarande icke-null-standardvärde om det är tillgängligt, eller NULL annars. Om en kolumn inte tillåter nollvärden och inte har ett standardvärde definierat, misslyckas INSERT-satsen och ett meddelande visas.

Exemplet nedan infogar rader i tabellen Employee i SampleDb-databasen, vilket visar användningen av en INSERT-sats för att infoga en liten mängd data i databasen:

ANVÄND SampleDb; INFOGA I Anställda VÄRDEN (34990, "Andrey", "Batonov", "d1"); INSERT INTO Employee VALUES (38640, "Alexey", "Vasin", "d3");

Det finns två olika sätt infoga värden i en ny rad. INSERT-satsen i exemplet nedan använder uttryckligen nyckelordet NULL och infogar ett NULL-värde i motsvarande kolumn:

ANVÄND SampleDb; INFOGA I Anställda VÄRDEN (34991, "Andrey", "Batonov", NULL);

För att infoga värden i vissa (men inte alla) kolumner i en tabell behöver du vanligtvis explicit ange dessa kolumner. Ospecificerade kolumner måste antingen tillåta NULL-värden eller ha ett standardvärde definierat.

ANVÄND SampleDb; INSERT INTO Employee(Id, FirstName, LastName) VÄRDEN (34992, "Andrey", "Batonov");

De två föregående exemplen är likvärdiga. I tabellen Employee är den enda kolumnen som tillåter NULL-värden kolumnen DepartmentNumber, och alla andra kolumner inaktiverades av NOT NULL-satsen i CREATE TABLE-satsen.

Värdeordning i VALUES erbjudande INSERT-satser kan skilja sig från den ordning som anges i CREATE TABLE-satsen. I det här fallet måste deras ordning matcha den ordning som motsvarande kolumner är listade i kolumnlistan. Nedan är ett exempel på att infoga data i en annan ordning än originalet:

ANVÄND SampleDb; INSERT INTO Employee(Departament Number, AfterName, Id, FirstName) VÄRDEN ("d1", "Batonov", 34993, "Andrey");

Infogar flera rader

Den andra formen av INSERT-satsen infogar en eller flera rader valda av en underfråga i tabellen. Exemplet nedan visar hur man infogar rader i en tabell med den andra formen av INSERT-satsen. I det här fallet exekveras en fråga för att välja nummer och namn på avdelningar i Moskva, och den resulterande resultatuppsättningen laddas in i en ny tabell som skapats tidigare.

Den nya MoscowDepartment-tabellen som skapats i exemplet ovan har samma kolumner som den befintliga Department-tabellen, förutom den saknade platskolumnen. Underfrågan i INSERT-satsen väljer alla rader i avdelningstabellen för vilka kolumnvärdet Plats är "Moskva", som sedan infogas i den nya tabellen som skapas i början av frågan.

Exemplet nedan visar ett annat sätt att infoga rader i en tabell med den andra formen av INSERT-satsen. I det här fallet exekveras en förfrågan för att välja personalnummer, projektnummer och projektstartdatum för alla anställda med positionen "Manager" som arbetar med projekt p2 och sedan ladda den resulterande resultatuppsättningen i en ny tabell skapad i början av frågan:

ANVÄND SampleDb; CREATE TABLE ManagerTeam (EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, EnterDate DATE); INSERT INTO ManagerTeam (EmpId, ProjectNumber, EnterDate) SELECT EmpId, ProjectNumber, EnterDate FROM Works_on WHERE Job = "Manager";

Innan du infogade rader med hjälp av INSERT-satsen var tabellerna MoscowDepartment och ManagerTeam (i exemplen ovan) tomma. Om tabellen redan fanns och innehöll rader med data, skulle nya rader läggas till i den.

I tidigare avsnitt har vi tittat på arbetet med att hämta data från förskapade tabeller. Nu är det dags att ta reda på hur vi kan skapa/ta bort tabeller, lägga till nya poster och ta bort gamla. För dessa ändamål i SQL Det finns operatörer som: SKAPA- skapar en tabell, ÄNDRA- ändrar tabellstrukturen, SLÄPPA- tar bort en tabell eller ett fält, FÖRA IN- lägger till data i tabellen. Låt oss börja bekanta oss med denna grupp av operatörer från operatören FÖRA IN.

1. Lägga till hela rader

Som namnet antyder, operatören FÖRA IN används för att infoga (lägga till) rader i en databastabell. Du kan lägga till på flera sätt:

  • - lägg till en hel rad
  • - lägg till en del av en rad
  • - lägg till frågeresultat.

Så för att lägga till en ny rad i en tabell måste vi ange tabellnamnet, lista kolumnnamnen och ange värdet för varje kolumn med hjälp av konstruktionen SÄTT IN I tabellnamn (fält1, fält2 ...) VÄRDEN (värde1, värde2...). Låt oss titta på ett exempel.

INFOGA I säljare (ID, adress, stad, säljarens namn, land) VÄRDEN("6", "1st Street", "Los Angeles", "Harry Monroe", "USA")

Du kan också ändra ordningen på kolumnnamnen, men samtidigt måste du ändra ordningen på värdena i parametern VÄRDEN.

2. Lägga till en del av raderna

I föregående exempel, när du använder operatorn FÖRA IN vi har uttryckligen markerat tabellkolumnnamnen. Med denna syntax kan vi hoppa över några kolumner. Det betyder att du anger värden för vissa kolumner men inte anger dem för andra. Till exempel:

INFOGA I Säljarens (ID, Ort, Säljarnamn) VÄRDEN("6", "Los Angeles", "Harry Monroe")

I det här exemplet har vi inte angett ett värde för två kolumner Adress Och Land. Du kan utesluta vissa kolumner från uttalandet SÄTT IN I, om detta tillåter tabelldefinitionen. I detta fall måste ett av villkoren vara uppfyllt: denna kolumn definieras som giltig NULL(avsaknad av något värde) eller det angivna standardvärdet i tabelldefinitionen. Det betyder att om inget värde anges kommer standardvärdet att användas. Om du saknar en kolumn i en tabell som inte tillåter att värden visas i dess rader NULL och inte har ett standardvärde definierat, kommer DBMS att generera ett felmeddelande och raden kommer inte att läggas till.

3. Lägga till valda data

I föregående exempel infogade vi data i tabeller genom att ange dem manuellt i frågan. Dock operatören SÄTT IN I tillåter oss att automatisera denna process om vi vill infoga data från en annan tabell. För detta ändamål i SQL finns en sådan konstruktion som INFOGA I ... VÄLJ .... Denna design låter dig samtidigt välja data från en tabell och infoga den i en annan. Låt oss anta att vi har ett annat bord Säljare_EU med en lista över säljare av våra varor i Europa och vi måste lägga till dem i den allmänna tabellen Säljare. Strukturen för dessa tabeller är densamma (samma antal kolumner och samma namn), men data är olika. För att göra detta kan vi skriva följande fråga:

INFOGA I Säljare (ID, Adress, Stad, Säljarnamn, Land) VÄLJID, adress, stad, säljarens namn, land FRÅN Säljare_EU

Du måste vara uppmärksam så att värdena för interna nycklar inte upprepas (fält ID), annars uppstår ett fel. Operatör VÄLJ kan också innehålla förslag VAR för att filtrera data. Det bör också noteras att DBMS inte uppmärksammar namnen på kolumnerna i uttalandet VÄLJ, bara i vilken ordning de är ordnade är viktig för henne. Därför data i den första angivna kolumnen som valdes pga VÄLJ, kommer att fyllas i den första kolumnen i tabellen i alla fall Säljare, specificerad efter operatören SÄTT IN I, oavsett fältnamn.

4. Kopiera data från en tabell till en annan

När man arbetar med databaser finns det ofta ett behov av att skapa kopior av alla tabeller för säkerhetskopiering eller modifiering. Att göra fullständig kopia tabeller i SQL finns det en separat operator VÄLJ IN. Vi behöver till exempel skapa en kopia av tabellen Säljare, måste du skriva begäran enligt följande:

VÄLJ * INTO Sellers_new FROM Sellers

Till skillnad från den tidigare designen INFOGA I ... VÄLJ ... När data läggs till i en befintlig tabell, kopierar designen data till den nya tabellen. Du kan också säga att den första konstruktionen importerar data och den andra exporterar. När du använder designen VÄLJ ... TILL ... FRÅN ... Följande bör övervägas:

  • - du kan använda vilka meningar som helst i operatorn VÄLJ, Till exempel GRUPP AV Och HAR
  • - du kan använda en join för att lägga till data från flera tabeller
  • - data kan bara läggas till i en tabell, oavsett hur många tabeller den togs från.

Team lägger till rader i tabellen eller huvudtabellvy.

SQL INSERT Kommandosyntax

Infoga kommandosyntax


Grundläggande nyckelord och parametrar för kommandot INSERT
  • schema- behörighetsidentifierare, vanligtvis matchar namnet på någon användare
  • bordsvy- namnet på tabellen i vilken raderna ska infogas; om en vy är angiven infogas raderna i vyns huvudtabell
  • subquery_1- en underfråga som servern bearbetar på samma sätt som en vy
  • kolumn- en tabell eller vykolumn där värdet från frasen skrivs in för varje infogat rad VÄRDEN eller underfråga; om en av tabellens kolumner utelämnas från den här listan, är kolumnvärdet för den infogade raden det standardkolumnvärde som definierades när tabellen skapades. Om en kolumnlista helt utelämnas, satsen VÄRDEN eller så måste frågan bestämma värden för alla kolumner i tabellen
  • VÄRDEN- definierar en sträng med värden som kommer att infogas i tabellen eller vyn; innebörden måste definieras i meningen VÄRDEN för varje kolumn i kolumnlistan
  • subquery_2- en underfråga som returnerar rader infogade i tabellen; urvalslistan för den här underfrågan måste ha samma antal kolumner som satskolumnlistan

Påstående med frasen VÄRDEN lägger till en enda rad i tabellen. Den här raden innehåller värdena som definieras av frasen VÄRDEN.
Uttalande med underfråga istället för en fras VÄRDEN lägger till alla rader som returneras av underfrågan till tabellen. Servern bearbetar underfråga och infogar varje returnerad rad i tabellen. Om underfrågan inte väljer några rader infogar servern inga rader i tabellen.
Underfråga kan komma åt vilken tabell eller vy som helst, inklusive måltabellen . Servern tilldelar värden till fält i nya rader baserat på den interna positionen för kolumnerna i tabellen och ordningen på frasvärdena VÄRDEN eller i frågevallistan. Om några kolumner saknas i kolumnlistan tilldelar servern dem standardvärdena som definierades när tabellen skapades. Om någon av dessa kolumner har en NOT NULL-begränsning returnerar servern ett fel som indikerar att begränsningen har överträtts och avbryter INSERT-satsen.
När en INSERT-sats utfärdas, aktiveras alla INSERT-utlösare som definierats i tabellen.

INFOGA I Exempel 1

SÄTT IN I avd VÄRDEN(50, "PRODUKTER", "SAN FRANCISCO");

SÄTT IN I Kunder (stad, cname, cnum) VÄRDEN('London', 'Hoffman', 2001);

INFOGA I Exempel 2
Följande kommando kopierar data från företagsanställda vars provisioner överstiger 25 % av inkomsten till bonustabellen:

SÄTT IN I bonus VÄLJ ename, job, sal, comm FROM emp WHERE comm > 0,25 * sal;

INFOGA I Exempel 3
Om du behöver sätta in NULL-värde, du måste ange det som ett normalt värde enligt följande:

SÄTT IN I Säljare VÄRDEN (1001,'Peel',NULL,12);

INFOGA I Exempel 4
Kommandot kan användas för att hämta värden från en tabell och placera dem i en annan med hjälp av en fråga. För att göra detta räcker det att ersätta meningen VÄRDEN till motsvarande begäran:

SÄTT IN I Londonstaff VÄLJ * FRÅN Säljare WHERE stad = 'London';

MySQL INFOGA

För att infoga nya rader i en MySQL-databas, använd INSERT kommando, kommandoexempel ges nedan:
INFOGA I Exempel 1.
Föra in ny linje till tabellen tabellnamn.

SÄTT IN I

INFOGA I Exempel 2.
Att infoga en ny rad i tabellen table_name som indikerar infogningen av data i de kolumner vi behöver.

SÄTT IN I tabellnamn VALUES('1','165','0','namn');

I databasen MySQL Det är möjligt att infoga flera nya rader med ett kommando.
INFOGA I Exempel 3.
Infogar flera rader i tabellen tabellnamn.

SÄTT IN I table_name (tbl_id, chislo, chislotwo, name) VÄRDEN ('1','159','34','name1'), ('2','14','61','name2'), ('3' ','356','8','namn3');

sql-frågan INSERT INTO är vettigt när en databastabell har skapats. Det vill säga att tabellen finns, har ett namn, skapat rader och kolumner. tabellen skapas av operatören: , tabellen ändras av operatören .

sql-fråga INSERT INTO - frågesyntax

sql-frågan INSERT INTO har följande syntax:

INSERT INTO tabellnamn (inom parentes, infoga vid behov en lista med kolumner där du vill infoga data) VÄRDEN infogade data1, infogade data2, infogade data3.

Du kan infoga ett IGNORE-alternativ mellan INSERT och INTRO. Det krävs inte. Behövs för att skydda primärnycklar vid redigering av en tabell. Annars, om duplicering av primärnycklar inträffar under redigering, när du infogar alternativet IGNORE, kommer den första raden med primärnyckeln att finnas kvar i tabellen som redigeras. Andra primärnycklar kommer att raderas. Som standard utelämnar vi det här alternativet.

Det finns valfria alternativ LOW_PRIORITY och DELAYED. De bestämmer prioriteringarna för att lägga till information till databasen. Den första anger att vänta på att databasen ska släppas, den andra betyder buffring av information.

Raden i frågan: INSERT med VALUES-frasen låter dig lägga till en enda rad i databastabellen. VALUES-satsen innehåller värdena för denna data.

Undersökningar kan anges istället för VALUES-frasen. INSERT med en underfråga lägger till raderna som returneras av underfrågan till tabellen. Databasservern bearbetar underfrågan och infogar alla returnerade rader i tabellen. Servern infogar inte rader om inte underfrågan väljer dem.

  • subquery_1 - en subquery som servern bearbetar på samma sätt som vyn
  • subquery_2 är en subquery som returnerar rader infogade i tabellen. Listan med denna underfråga måste ha samma antal kolumner som INSERT kolumnlistan.

Undersökningar används praktiskt taget inte i en MySQL-databas.

Exempel på sql-fråga INSERT INTO i en MySQL-databas

Vi infogar nya rader i MySQL-databasen med kommandot INSERT INTRO.

Första exemplet.

Infoga nya rader i tabellen tabellnamn.

INSERT INTO table_name VALUES ('2','145','1','name');

Det betyder att vi vill infoga värdena 2,145,1,namn i tabellen table_name kolumner. Eftersom kolumnerna inte är specificerade fylls värdena i alla kolumner i tabellen.

Exempel två.

Infoga information i de obligatoriska (specificerade) kolumnerna i tabellen tabellnamn.

INFOGA I tabellnamn (klient_kund, klient_underklient, klient_post) VÄRDEN ('namn1','undernamn1',' [e-postskyddad]′), (‘namn2′,’undernamn2′,’ [e-postskyddad]′), (‘namn3′,’undernamn3′,(’ [e-postskyddad]′);

Igor Serov speciellt för webbplatsen "".

INSERT-satsen infogar nya poster i en tabell. I det här fallet kan kolumnvärdena vara bokstavliga konstanter eller vara resultatet av exekvering av en underfråga. I det första fallet används en separat INSERT-sats för att infoga varje rad; i det andra fallet kommer lika många rader att infogas som returneras av underfrågan.

Operatorsyntaxen är som följer:

    SÄTT IN I [ (,...) ]

    (VÄRDEN(,...))

  1. | (URSPRUNGLIGA VÄRDEN)

Som du kan se från den presenterade syntaxen är listan med kolumner valfri (detta sägs hakparentes i syntaxbeskrivningen). Om det saknas måste listan över infogade värden vara komplett, det vill säga ge värden för alla kolumner i tabellen. I det här fallet måste ordningen på värdena motsvara den ordning som anges av CREATE TABLE-satsen för tabellen i vilken raderna infogas. Dessutom måste dessa värden vara av samma datatyp som kolumnerna där de anges. Som ett exempel kan du överväga att infoga en rad i produkttabellen skapad av följande CREATE TABLE-sats:

    SKAPA TABELL produkt

    tillverkare char (1) INTE NULL,

    modell varchar(4) NOT NULL,

    typ varchar(7) NOT NULL

Anta att du vill lägga till PC-modellen 1157 från tillverkare B till denna tabell. Detta kan göras med följande uttalande:

    SÄTT IN I produkten

    VÄRDEN ("B", 1157, "PC");

Om du anger en lista med kolumner kan du ändra deras "naturliga" ordning:

    SÄTT IN I produkt (typ, modell, tillverkare)

    VÄRDEN ("PC", 1157, "B");

Det verkar som att detta är en helt onödig funktion, vilket bara gör designen mer krånglig. Det vinner dock om kolumnerna har standardvärden. Tänk på följande tabellstruktur:

    SKAPA TABELL produkt_D

    tillverkare char (1) NULL,

    modell varchar(4) NULL,

    typ varchar (7 ) INTE NULL DEFAULT "PC"

Observera att här har värdena för alla kolumner standardvärden (de två första är NULL och den sista kolumnen är typ - PC). Nu kan vi skriva:

    INSERT INTO Product_D (modell, tillverkare)

    VÄRDEN(1157, "B");

I det här fallet kommer det saknade värdet när du infogar en rad att ersättas med standardvärdet - PC. Observera att om en kolumn inte ges ett standardvärde i en CREATE TABLE-sats och en NOT NULL-begränsning anges för att förbjuda användningen av NULL i den tabellkolumnen, så antas standardvärdet NULL.

Frågan uppstår: är det möjligt att inte ange en lista med kolumner och ändå använda standardvärdena? Svaret är ja. För att göra detta, istället för att explicit ange värdet, använd det reserverade ordet DEFAULT :

    INFOGA I Produkt_D

    VÄRDEN ("B", 1158, DEFAULT);

Eftersom alla kolumner har standardvärden, för att infoga en rad med standardvärden kan du skriva:

    INFOGA I Produkt_D

    VÄRDEN(DEFAULT, DEFAULT, DEFAULT);

Men för detta fall finns det en speciell konstruktion DEFAULT VALUES (se operatorsyntax), med vilken ovanstående operator kan skrivas om i formen

    INSERT INTO Product_D STANDARDVÄRDEN ;

Observera att när du infogar en rad i en tabell, kontrolleras alla begränsningar som gäller för denna tabell. Dessa kan vara primärnyckel eller unika indexbegränsningar, CHECK-begränsningar eller referensintegritetsbegränsningar. Om någon begränsning överträds kommer radinfogningen att avvisas. Låt oss nu överväga fallet med att använda en underfråga. Anta att vi måste infoga i tabellen Product_D alla rader från produkttabellen relaterade till persondatormodeller (typ = 'PC'). Eftersom de värden vi behöver redan finns i någon tabell, är manuell generering av infogade rader för det första ineffektivt och för det andra kan det tillåta inmatningsfel. Att använda en underfråga löser dessa problem:

Användningen av "*"-symbolen i underfrågan är motiverad i det här fallet, eftersom ordningen på kolumnerna är densamma för båda tabellerna. Om så inte var fallet skulle en kolumnlista behöva tillämpas i antingen INSERT-satsen, underfrågan eller båda, vilket skulle matcha kolumnernas ordning:

Här, som tidigare, kan du inte ange alla kolumner om du vill använda befintliga standardvärden, till exempel:

I det här fallet kommer typkolumnen i tabellen Product_D att ersättas med standardvärdet PC för alla infogade rader.

Observera att när du använder en underfråga som innehåller ett predikat, kommer endast de rader för vilka predikatvärdet är TRUE (inte OKÄNT!) att infogas. Med andra ord, om typkolumnen i produkttabellen var NULL-bar och det värdet fanns i ett antal rader, skulle dessa rader inte infogas i tabellen Product_D.

Den konstgjorda tekniken att använda en underfråga som bildar en rad med UNION ALL-satsen gör att du kan övervinna begränsningen med att infoga en rad i INSERT-satsen när du använder radkonstruktorn i VALUES-satsen. Så om vi behöver infoga flera rader med en INSERT-sats kan vi skriva:

    INFOGA I Produkt_D

    VÄLJ "B" AS-tillverkare, 1158 AS-modell, "PC" AS-typ

    UNION ALLA

    VÄLJ "C", 2190, "Bärbar"

    UNION ALLA

    VÄLJ "D" , 3219 , "Skrivare" ;

Att använda UNION ALL är att föredra framför UNION även om frånvaron av dubblettrader är garanterad, eftersom i detta fall ingen kontroll kommer att utföras för att eliminera dubbletter.

Det bör noteras att infogning av flera tupler med hjälp av radkonstruktorn redan är implementerat i Relationsdatabashanteringssystem (DBMS), utvecklat av Microsoft Corporation.Structured Query Language) är ett universellt datorspråk som används för att skapa, modifiera och manipulera data i relationsdatabaser. SQL Server 2008. Med denna möjlighet kan den sista frågan skrivas om som:

    INFOGA I PRODUKT_D-VÄRDEN

    ("B", 1158, "PC"),

    ("C", 2190, "Bärbar dator"),


Topp