Sett inn i valgt orakelsyntaks. Grunnleggende om T-SQL. DML. Setter inn flere rader

I tillegg til SELECT-setningen diskutert tidligere, inneholder Data Manipulation Language (DML) tre andre setninger: INSERT, UPDATE og DELETE. I likhet med SELECT-setningen fungerer disse tre setningene på enten tabeller eller visninger. Denne artikkelen diskuterer INSERT-setningen, og de to andre setningene diskuteres i neste artikkel.

INSERT-setning setter inn rader (eller deler av rader) i en tabell. Det er to forskjellige former for denne instruksjonen:

INSERT tab_name [(col_list)] STANDARDVERDIER | VERDIER (( STANDARD | NULL | uttrykk ) [ ,...n]) INSERT INTO tab_name | view_name [(col_list)] (select_statement | execute_statement) Syntakskonvensjoner

Den første formen av instruksjonen lar deg sette inn en rad (eller en del av den) i tabellen. Og den andre formen av INSERT-setningen lar deg sette inn i en tabell resultatsettet til en SELECT-setning eller en lagret prosedyre utført av en EXECUTE-setning. Den lagrede prosedyren må returnere data som skal settes inn i tabellen. Når den brukes med en INSERT-setning, kan en SELECT-setning velge verdier fra en annen eller samme tabell som dataene settes inn i, så lenge datatypene til de tilsvarende kolonnene er kompatible.

For begge skjemaene må datatypen for hver innsatte verdi være kompatibel med datatypen til den tilsvarende tabellkolonnen. Alle strenger og midlertidige data må være omgitt av anførselstegn; Numeriske verdier trenger ikke være omgitt av anførselstegn.

Setter inn en enkelt rad

For begge former for INSERT-setningen er det valgfritt å spesifisere kolonnelisten eksplisitt. Å ikke liste opp kolonner er det samme som å spesifisere alle kolonner i tabellen.

DEFAULT VALUES parameter setter inn standardverdier for alle kolonner. Kolonner med TIMESTAMP-datatypen eller IDENTITY-egenskapen settes inn som standard med verdier som genereres automatisk av systemet. For kolonner med andre datatyper settes den tilsvarende ikke-null standardverdien inn hvis tilgjengelig, eller NULL ellers. Hvis en kolonne ikke tillater nullverdier og ikke har en standardverdi definert, mislykkes INSERT-setningen og en melding vises.

Eksemplet nedenfor setter inn rader i Employee-tabellen i SampleDb-databasen, og demonstrerer bruken av en INSERT-setning for å sette inn en liten mengde data i databasen:

BRUK SampleDb; INSERT INTO Employee VALUES (34990, "Andrey", "Batonov", "d1"); INSERT INTO Employee VALUES (38640, "Alexey", "Vasin", "d3");

Det er to forskjellige måter sette inn verdier i en ny rad. INSERT-setningen i eksemplet nedenfor bruker eksplisitt nøkkelordet NULL og setter inn en NULL-verdi i den tilsvarende kolonnen:

BRUK SampleDb; INSERT INTO Employee VALUES (34991, "Andrey", "Batonov", NULL);

For å sette inn verdier i noen (men ikke alle) kolonner i en tabell, må du vanligvis spesifisere disse kolonnene eksplisitt. Uspesifiserte kolonner må enten tillate NULL-verdier eller ha en standardverdi definert.

BRUK SampleDb; INSERT INTO Employee(Id, FirstName, LastName) VERDIER (34992, "Andrey", "Batonov");

De to foregående eksemplene er likeverdige. I Employee-tabellen er den eneste kolonnen som tillater NULL-verdier DepartmentNumber-kolonnen, og alle andre kolonner ble deaktivert av NOT NULL-leddet i CREATE TABLE-setningen.

Rekkefølge av verdier i VALUES tilbud INSERT-setninger kan avvike fra rekkefølgen som er spesifisert i CREATE TABLE-setningen. I dette tilfellet må rekkefølgen deres samsvare med rekkefølgen som de tilsvarende kolonnene er oppført i kolonnelisten. Nedenfor er et eksempel på å sette inn data i en annen rekkefølge enn originalen:

BRUK SampleDb; INSERT INTO Employee(Departament Number, LastName, Id, FirstName) VERDIER ("d1", "Batonov", 34993, "Andrey");

Setter inn flere rader

Den andre formen av INSERT-setningen setter inn én eller flere rader valgt av en underspørring i tabellen. Eksemplet nedenfor viser hvordan du setter inn rader i en tabell ved å bruke den andre formen av INSERT-setningen. I dette tilfellet utføres en spørring for å velge numrene og navnene på avdelinger som ligger i Moskva, og det resulterende resultatsettet lastes inn i en ny tabell opprettet tidligere.

Den nye MoscowDepartment-tabellen opprettet i eksempelet ovenfor har de samme kolonnene som den eksisterende avdelingstabellen, bortsett fra den manglende plasseringskolonnen. Underspørringen i INSERT-setningen velger alle rader i avdelingstabellen der Location-kolonneverdien er "Moskva", som deretter settes inn i den nye tabellen som ble opprettet i begynnelsen av spørringen.

Eksemplet nedenfor viser en annen måte å sette inn rader i en tabell ved å bruke den andre formen av INSERT-setningen. I dette tilfellet utføres en spørring for å velge personnummer, prosjektnummer og prosjektstartdatoer for alle ansatte med stillingen "Leder" som jobber med prosjekt p2 og deretter laste det resulterende resultatsettet inn i en ny tabell opprettet i begynnelsen av spørringen:

BRUK 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";

Før du satte inn rader ved hjelp av INSERT-setningen, var tabellene for MoskvaDepartment og ManagerTeam (i eksemplene ovenfor) tomme. Hvis tabellen allerede eksisterte og inneholdt rader med data, vil nye rader bli lagt til den.

I tidligere avsnitt har vi sett på arbeidet med å hente data fra forhåndslagrede tabeller. Nå er det på tide å finne ut hvordan vi kan opprette/slette tabeller, legge til nye poster og slette gamle. For disse formålene i SQL Det er operatører som: SKAPE- lager en tabell, ENDRE- endrer tabellstrukturen, MISTE- sletter en tabell eller et felt, SETT INN- legger til data i tabellen. La oss begynne å bli kjent med denne gruppen av operatører fra operatøren SETT INN.

1. Legge til hele linjer

Som navnet tilsier, operatøren SETT INN brukes til å sette inn (legge til) rader i en databasetabell. Legging kan gjøres på flere måter:

  • - legg til en hel linje
  • - legg til en del av en linje
  • - legg til søkeresultater.

Så for å legge til en ny rad i en tabell, må vi spesifisere tabellnavnet, liste opp kolonnenavnene og angi verdien for hver kolonne ved å bruke konstruksjonen SETTE INN I tabellnavn (felt1, felt2 ...) VERDIER (verdi1, verdi2...). La oss se på et eksempel.

INSERT INTO Selgere (ID, Adresse, By, Selger_navn, Land) VERDIER("6", "1st Street", "Los Angeles", "Harry Monroe", "USA")

Du kan også endre rekkefølgen på kolonnenavn, men samtidig må du endre rekkefølgen på verdiene i parameteren VERDIER.

2. Legge til en del av linjene

I forrige eksempel, når du bruker operatøren SETT INN vi har eksplisitt merket tabellkolonnenavnene. Ved å bruke denne syntaksen kan vi hoppe over noen kolonner. Dette betyr at du legger inn verdier for noen kolonner, men ikke oppgir dem for andre. For eksempel:

INSERT INTO Sellers (ID, City, Seller_name) VERDIER("6", "Los Angeles", "Harry Monroe")

I dette eksemplet spesifiserte vi ikke en verdi for to kolonner Adresse Og Land. Du kan ekskludere noen kolonner fra setningen SETTE INN I, hvis dette tillater tabelldefinisjonen. I dette tilfellet må ett av betingelsene være oppfylt: denne kolonnen er definert som gyldig NULL(fravær av noen verdi) eller den angitte standardverdien i tabelldefinisjonen. Dette betyr at hvis ingen verdi er spesifisert, vil standardverdien bli brukt. Hvis du mangler en kolonne fra en tabell som ikke tillater at verdier vises i radene NULL og ikke har en standardverdi definert, vil DBMS generere en feilmelding og raden vil ikke bli lagt til.

3. Legge til valgte data

I forrige eksempel satte vi inn data i tabeller ved å legge dem inn manuelt i spørringen. Imidlertid operatøren SETTE INN I lar oss automatisere denne prosessen hvis vi ønsker å sette inn data fra en annen tabell. For dette formålet i SQL er det en slik konstruksjon som SETTE INN I ... VELG .... Denne utformingen lar deg samtidig velge data fra en tabell og sette den inn i en annen. La oss anta at vi har et annet bord Selgere_EU med en liste over selgere av våre varer i Europa, og vi må legge dem til den generelle tabellen Selgere. Strukturen til disse tabellene er den samme (samme antall kolonner og samme navn), men dataene er forskjellige. For å gjøre dette kan vi skrive følgende spørring:

INSERT INTO Selgere (ID, Adresse, By, Selgernavn, Land) VELGID, adresse, by, selgernavn, land FRA selgere_EU

Du må være oppmerksom slik at verdiene til interne nøkler ikke gjentas (felt ID), ellers vil det oppstå en feil. Operatør PLUKKE UT kan også inneholde forslag HVOR for å filtrere data. Det skal også bemerkes at DBMS ikke tar hensyn til navnene på kolonnene i uttalelsen PLUKKE UT, bare rekkefølgen de er ordnet i er viktig for henne. Derfor er dataene i den første angitte kolonnen som ble valgt pga PLUKKE UT, vil uansett fylles ut i den første kolonnen i tabellen Selgere, spesifisert etter operatøren SETTE INN I, uavhengig av feltnavnet.

4. Kopiere data fra en tabell til en annen

Når du arbeider med databaser, er det ofte behov for å lage kopier av alle tabeller for sikkerhetskopiering eller modifikasjon. Å gjøre full kopi tabeller i SQL er det en egen operatør VELG I. For eksempel må vi lage en kopi av tabellen Selgere, må du skrive forespørselen som følger:

SELECT * INTO Sellers_new FROM Sellers

I motsetning til tidligere design SETTE INN I ... VELG ... Når data legges til en eksisterende tabell, kopierer designet dataene til den nye tabellen. Du kan også si at den første konstruksjonen importerer data, og den andre eksporterer. Når du bruker designet VELG ... INTO ... FRA ... Følgende bør vurderes:

  • - du kan bruke alle setninger i operatoren PLUKKE UT, som for eksempel GRUPPE AV Og HA
  • - du kan bruke en sammenføyning for å legge til data fra flere tabeller
  • - data kan bare legges til en tabell, uansett hvor mange tabeller de ble hentet fra.

Team legger til rader i tabellen eller hovedtabellvisning.

SQL INSERT kommandosyntaks

Sett inn kommandosyntaks


Grunnleggende nøkkelord og parametere for INSERT-kommandoen
  • skjema- tillatelsesidentifikator, vanligvis samsvarer med navnet på en bruker
  • bordvisning- navnet på tabellen som radene skal settes inn i; hvis en visning er spesifisert, settes radene inn i visningens hovedtabell
  • subquery_1- en underspørring som serveren behandler på samme måte som en visning
  • kolonne- en tabell eller visningskolonne der verdien fra frasen legges inn for hver innsatt rad VERDIER eller underspørring; hvis en av tabellens kolonner er utelatt fra denne listen, er kolonneverdien for den innsatte raden standard kolonneverdi som ble definert da tabellen ble opprettet. Hvis en kolonneliste er fullstendig utelatt, vil klausulen VERDIER eller spørringen må bestemme verdier for alle kolonnene i tabellen
  • VERDIER- definerer en streng med verdier som vil bli satt inn i tabellen eller visningen; betydningen må defineres i setningen VERDIER for hver kolonne i listen over kolonner
  • subquery_2- en underspørring som returnerer rader satt inn i tabellen; utvalgslisten til denne underspørringen må ha samme antall kolonner som setningskolonnelisten

Uttalelse med uttrykket VERDIER legger til en enkelt rad i tabellen. Denne linjen inneholder verdiene som er definert av uttrykket VERDIER.
Uttalelse med underspørring i stedet for en frase VERDIER legger til alle radene som returneres av underspørringen til tabellen. Serveren behandler underspørring og setter inn hver returnerte rad i tabellen. Hvis underspørringen ikke velger noen rader, setter ikke serveren inn noen rader i tabellen.
Undersøk kan få tilgang til enhver tabell eller visning, inkludert målpåstandstabellen . Serveren tildeler verdier til felt i nye rader basert på den interne plasseringen av kolonnene i tabellen og rekkefølgen på setningsverdiene VERDIER eller i søkelisten. Hvis noen kolonner mangler fra kolonnelisten, tildeler serveren dem standardverdiene som ble definert da tabellen ble opprettet. Hvis noen av disse kolonnene har en NOT NULL-begrensning, returnerer serveren en feil som indikerer at begrensningen ble brutt og avbryter INSERT-setningen.
Når en INSERT-setning utstedes, aktiveres enhver INSERT-utløser definert på tabellen.

SETTE INN I Eksempel 1

SETTE INN I gjeld VERDIER(50, "PRODUKTER", "SAN FRANCISCO");

SETTE INN I Kunder (by, cname, cnum) VERDIER('London', 'Hoffman', 2001);

SETTE INN I Eksempel 2
Følgende kommando kopierer dataene til selskapets ansatte hvis provisjoner overstiger 25 % av inntekten til bonustabellen:

SETTE INN I bonus SELECT ename, job, sal, comm FROM emp WHERE comm > 0,25 * sal;

SETTE INN I Eksempel 3
Hvis du trenger å sette inn NULL-verdi, må du angi den som en normal verdi som følger:

SETTE INN I Selgere VERDIER (1001,'Peel',NULL,12);

SETTE INN I Eksempel 4
Kommandoen kan brukes til å hente verdier fra en tabell og plassere dem i en annen ved å bruke en spørring. For å gjøre dette er det nok å erstatte setningen VERDIER til den tilsvarende forespørselen:

SETTE INN I Londonstaff VELG * FRA selgere WHERE by = 'London';

MySQL INSERT

For å sette inn nye rader i en MySQL-database, bruk INSERT kommando, kommandoeksempler er gitt nedenfor:
SETTE INN I Eksempel 1.
Sett inn ny linje til tabellen tabellnavn.

SETTE INN I

SETTE INN I Eksempel 2.
Sette inn en ny rad i tabellen table_name som indikerer innsetting av data i kolonnene vi trenger.

SETTE INN I tabellnavn VERDIER('1','165','0','navn');

I databasen MySQL Det er mulig å sette inn flere nye linjer med én kommando.
SETTE INN I Eksempel 3.
Setter inn flere rader i tabellen tabellnavn.

SETTE INN I table_name (tbl_id, chislo, chislotwo, navn) VERDIER ('1','159','34','name1'), ('2','14','61','navn2'), ('3' ','356','8','navn3');

sql-spørring INSERT INTO gir mening når en databasetabell er opprettet. Det vil si at tabellen eksisterer, har et navn, opprettet rader og kolonner. tabellen er opprettet av operatøren: , tabellen er modifisert av operatøren .

sql-spørring INSERT INTO - spørringssyntaks

sql-spørringen INSERT INTO har følgende syntaks:

INSERT INTO tabellnavn (i parentes, om nødvendig, sett inn en liste over kolonner der du vil sette inn data) VERDIER satt inn data1, satt inn data2, satt inn data3.

Du kan sette inn et IGNORE-alternativ mellom INSERT og INTRO. Det er ikke nødvendig. Nødvendig for å beskytte primærnøkler ved redigering av en tabell. Ellers, hvis duplisering av primærnøkler oppstår under redigering, vil den første raden med primærnøkkelen forbli i tabellen som redigeres når du setter inn IGNORE-alternativet. Andre primærnøkler vil bli slettet. Som standard utelater vi dette alternativet.

Det er valgfrie alternativer LOW_PRIORITY og DELAYED. De bestemmer prioriteringene for å legge til informasjon til databasen. Den første angir å vente på at databasen skal frigis, den andre betyr buffering av informasjon.

Linjen i spørringen: INSERT med VALUES-frasen vil tillate deg å legge til en enkelt rad i databasetabellen. VALUES-klausulen inneholder verdiene til disse dataene.

Underspørringer kan spesifiseres i stedet for VALUES-frasen. INSERT med en underspørring legger til radene som returneres av underspørringen til tabellen. Databaseserveren behandler underspørringen og setter inn alle returnerte rader i tabellen. Serveren setter ikke inn rader med mindre underspørringen velger dem.

  • subquery_1 - en subquery som serveren behandler på samme måte som visningen
  • subquery_2 er en subquery som returnerer rader satt inn i tabellen. Listen over denne underspørringen må ha samme antall kolonner som INSERT kolonnelisten.

Underspørringer brukes praktisk talt ikke i en MySQL-database.

Eksempler på sql-spørring INSERT INTO i en MySQL-database

Vi setter inn nye rader i MySQL-databasen ved å bruke INSERT INTRO-kommandoen.

Første eksempel.

Sett inn nye rader i tabellen tabellnavn.

INSERT INTO tabellnavn VERDIER ('2','145','1','navn');

Dette betyr at vi ønsker å sette inn verdiene 2,145,1,navn i tabellen table_name kolonnene. Siden kolonnene ikke er spesifisert, fylles verdiene ut i alle kolonnene i tabellen.

Eksempel to.

Sett inn informasjon i de nødvendige (spesifiserte) kolonnene i tabellen tabellnavn.

INSERT INTO table_name (client_customer, client_subclient, client_mail) VERDIER ('name1','subname1',' [e-postbeskyttet]′), (‘navn2′,’undernavn2′,’ [e-postbeskyttet]′), (‘navn3′,’undernavn3′,(’ [e-postbeskyttet]′);

Igor Serov spesielt for nettstedet "".

INSERT-setningen setter inn nye poster i en tabell. I dette tilfellet kan kolonneverdiene være bokstavelige konstanter, eller være resultatet av å utføre en underspørring. I det første tilfellet brukes en separat INSERT-setning for å sette inn hver rad; i det andre tilfellet vil like mange rader bli satt inn som returneres av underspørringen.

Operatorsyntaksen er som følger:

    SETTE INN I [ (,...) ]

    (VERDIER(,...))

  1. | (STANDARDVERDIER)

Som du kan se fra den presenterte syntaksen, er listen over kolonner valgfri (dette er sagt firkantede parenteser i syntaksbeskrivelsen). Hvis den mangler, må listen over innsatte verdier være fullstendig, det vil si gi verdier for alle kolonnene i tabellen. I dette tilfellet må rekkefølgen på verdiene samsvare med rekkefølgen spesifisert av CREATE TABLE-setningen for tabellen der radene er satt inn. I tillegg må disse verdiene være av samme datatype som kolonnene de er lagt inn i. Som et eksempel kan du vurdere å sette inn en rad i produkttabellen opprettet av følgende CREATE TABLE-setning:

    LAG TABELL-produkt

    maker char (1) IKKE NULL,

    modell varchar(4) IKKE NULL,

    type varchar(7) IKKE NULL

Anta at du vil legge til PC-modellen 1157 fra produsent B i denne tabellen. Dette kan gjøres med følgende setning:

    SETT INN I produktet

    VERDIER ("B", 1157, "PC");

Hvis du angir en liste over kolonner, kan du endre deres "naturlige" rekkefølge:

    SETTE INN I produktet (type, modell, produsent)

    VERDIER ("PC", 1157, "B");

Det ser ut til at dette er en helt unødvendig funksjon, som bare gjør designet mer tungvint. Den vinner imidlertid hvis kolonnene har standardverdier. Tenk på følgende tabellstruktur:

    LAG TABELL produkt_D

    maker char (1) NULL,

    modell varchar(4) NULL,

    type varchar (7 ) IKKE NULL STANDARD "PC"

Merk at her har verdiene for alle kolonnene standardverdier (de to første er NULL og den siste kolonnen er type - PC). Nå kan vi skrive:

    INSERT INTO Product_D (modell, produsent)

    VERDIER(1157, "B");

I dette tilfellet vil den manglende verdien når du setter inn en rad erstattes av standardverdien - PC. Merk at hvis en kolonne ikke er gitt en standardverdi i en CREATE TABLE-setning og en NOT NULL-begrensning er spesifisert for å forby bruken av NULL i den tabellkolonnen, antas standardverdien NULL.

Spørsmålet oppstår: er det mulig å ikke spesifisere en liste over kolonner og likevel bruke standardverdiene? Svaret er ja. For å gjøre dette, i stedet for å spesifisere verdien eksplisitt, bruk det reserverte ordet DEFAULT :

    INSERT INTO Product_D

    VERDIER ("B", 1158, STANDARD);

Siden alle kolonner har standardverdier, for å sette inn en rad med standardverdier kan du skrive:

    INSERT INTO Product_D

    VERDIER(STANDARD, STANDARD, STANDARD);

For dette tilfellet er det imidlertid en spesiell konstruksjon STANDARDVERDIER (se operatorsyntaks), som operatoren ovenfor kan skrives om i formen

    INSERT INTO Product_D STANDARDVERDIER ;

Merk at når du setter inn en rad i en tabell, blir alle restriksjoner pålagt denne tabellen sjekket. Disse kan være primærnøkkel eller unike indeksbegrensninger, CHECK-begrensninger ellerr. Hvis noen begrensning brytes, vil radinnsettingen bli avvist. La oss nå vurdere tilfellet med bruk av en underspørring. Anta at vi må sette inn i Product_D-tabellen alle rader fra produkttabellen relatert til PC-modeller (type = 'PC'). Siden verdiene vi trenger allerede er i en tabell, er manuell generering av innsatte rader for det første ineffektiv, og for det andre kan det tillate inndatafeil. Å bruke en underspørring løser disse problemene:

Bruken av "*"-symbolet i underspørringen er berettiget i dette tilfellet, siden rekkefølgen på kolonnene er den samme for begge tabellene. Hvis dette ikke var tilfelle, ville en kolonneliste måtte brukes i enten INSERT-setningen, underspørringen eller begge deler, som ville samsvare med rekkefølgen til kolonnene:

Her kan du som før spesifisere ikke alle kolonner hvis du vil bruke de eksisterende standardverdiene, for eksempel:

I dette tilfellet vil typekolonnen i Product_D-tabellen bli erstattet med standardverdien PC for alle innsatte rader.

Merk at når du bruker en underspørring som inneholder et predikat, vil bare de radene der predikatverdien er TRUE (ikke UKJENT!) settes inn. Med andre ord, hvis typekolonnen i produkttabellen var NULLable, og den verdien var til stede i et antall rader, ville disse radene ikke bli satt inn i Product_D-tabellen.

Den kunstige teknikken med å bruke en underspørring som danner en rad med UNION ALL-leddet lar deg overvinne begrensningen ved å sette inn én rad i INSERT-setningen når du bruker radkonstruktøren i VALUES-leddet. Så hvis vi trenger å sette inn flere rader med en INSERT-setning, kan vi skrive:

    INSERT INTO Product_D

    VELG "B" AS maker, 1158 AS modell, "PC" AS type

    UNION ALLE

    VELG "C", 2190, "Bærbar"

    UNION ALLE

    VELG "D" , 3219 , "Skriver" ;

Å bruke UNION ALL er å foretrekke fremfor UNION selv om fraværet av dupliserte rader er garantert, siden det i dette tilfellet ikke vil bli utført noen kontroll for å eliminere duplikater.

Det skal bemerkes at innsetting av flere tupler ved hjelp av radkonstruktøren allerede er implementert i Relational database management system (DBMS), utviklet av Microsoft Corporation.Structured Query Language) er et universelt dataspråk som brukes til å lage, endre og manipulere data i relasjonsdatabaser. SQL Server 2008. Gitt denne muligheten, kan den siste spørringen skrives om som:

    INSERT I PRODUKT_D-VERDIER

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

    ("C", 2190, "Bærbar datamaskin"),


Topp