Site Overlay

SQLShack (Svenska)

i den här artikeln lär vi oss olika metoder som används för att uppdatera data i en tabell med data från andra tabeller. ”Uppdatera från Välj” frågestruktur är den viktigaste tekniken för att utföra dessa uppdateringar.

en uppdateringsfråga används för att ändra en befintlig rad eller rader i databasen. UPPDATERINGSFRÅGOR kan ändra alla tabellrader, eller så kan vi begränsa uppdateringssatsen påverkar för vissa rader med hjälp av where-klausulen., För det mesta använder vi konstanta värden för att ändra data, till exempel följande strukturer.

hela uppdateringssatsen används för att ändra hela tabelldata med samma värde.,

1
2

UPDATE table
SET col1 = constant_value1 , col2 = constant_value2 , colN = constant_valueN

The conditional update statement is used to change the data that satisfies the WHERE condition.,

1
2
3

uppdateringstabell
ställ in col1 = constant_value1 , col2 = constant_value2 , Coln = constant_valuen
där col = val

för olika scenarier kan dock inte denna typ av konstant värdeanvändning räcka för oss, och vi behöver att använda andra tabelldata för att uppdatera vår tabell., Denna typ av uppdateringsdeklarationer är lite komplicerad än de vanliga strukturerna. I följande avsnitt kommer vi att lära oss att skriva den här typen av uppdateringsfråga med olika metoder, men först måste vi förbereda våra provdata. Då gör vi det här.

förbereda provdata

med hjälp av följande fråga kommer vi att skapa personer och adresslistor och fylla dem med några syntetiska data. Dessa två tabeller har en relation genom kolumnen PersonId, vilket innebär att i dessa två tabeller representerar kolumnvärdet PersonId samma person.,

uppdatera från SELECT: Join Method

i den här metoden kommer tabellen som ska uppdateras att förenas med referenstabellen (sekundär) som innehåller nya radvärden. Så att vi kan komma åt matchade data i referenstabellen baserat på den angivna kopplingstypen. Slutligen kan kolumnerna som ska uppdateras matchas med refererade kolumner och uppdateringsprocessen ändrar dessa kolumnvärden.

i följande exempel uppdaterar vi kolumndata för personcityname och PersonPostCode med kolumndata för staden och Postnummer i Adresslistabellen.,

1
2
3
4
5
6
7
8

UPDATE Per
SET
Per.PersonCityName=Addr.City,
Per.PersonPostCode=Addr.PostCode
FROM Persons Per
INNER JOIN
AddressList Addr
ON Per.PersonId = Addr.,

efter utförandet av uppdateringen från en utvald fråga kommer utmatningen från Personstabellen att vara som visas nedan;

1
välj * från personer

låt oss försöka förstå ovanstående kod:

vi skrev tabellnamnet, vilket kommer att uppdateras efter uppdateringssatsen., Efter det inställda sökordet specificerade vi kolumnnamnen som ska uppdateras, och vi matchade dem också med de refererade tabellkolumnerna. Efter från-klausulen skrev vi om tabellnamnet, vilket kommer att uppdateras. Efter Inner JOIN-klausulen specificerade vi den refererade tabellen och gick med i tabellen för att uppdateras. Utöver detta kan vi ange en WHERE-klausul och filtrera alla kolumner i den refererade eller uppdaterade tabellen. Vi kan också skriva om frågan med hjälp av alias för tabeller.,

1
2
3
4
5
6
7
8

UPDATE Per
SET
Per.PersonCityName=Addr.City,
Per.PersonPostCode=Addr.PostCode
FROM Persons Per
INNER JOIN
AddressList Addr
ON Per.PersonId = Addr.,PersonId

Performance tips:

index är mycket användbara databasobjekt för att förbättra sökresultatet i SQL Server. Särskilt om vi arbetar med utförandet av uppdateringsfrågan bör vi ta hänsyn till denna sannolikhet. Följande exekveringsplan illustrerar en exekveringsplan för föregående fråga. Den enda skillnaden är att denna fråga uppdaterade 3.000.000 rader av personer tabellen. Denna fråga slutfördes inom 68 sekunder.,

Vi lade till ett icke-grupperat index på tabellen personer innan för att uppdatera och det tillagda indexet involverar kolumnerna PersonCityName och PersonPostCode som indexnyckel.

följande exekveringsplan visar en exekveringsplan för samma fråga, men den här frågan slutfördes inom 130 sekunder på grund av det tillagda indexet, till skillnad från det första.

Indexuppdateringen och Sorteringsoperatörerna förbrukar 74% kostnad för exekveringsplanen., Vi har sett denna uppenbara prestandaskillnad mellan samma fråga på grund av indexanvändning på de uppdaterade kolumnerna. Som ett resultat, om de uppdaterade kolumnerna används av index, så här, till exempel, kan sökresultatet påverkas negativt. I synnerhet bör vi överväga detta problem om vi kommer att uppdatera ett stort antal rader. För att lösa problemet kan vi inaktivera eller ta bort indexet innan du kör uppdateringsfrågan.

å andra sidan ses ett varningsskylt på Sortoperatören, och det indikerar att något inte går bra för den här operatören., När vi håller musen över den här operatören kan vi se varningsdetaljerna.

under utförandet av frågan beräknar query optimizer en nödvändig minnesförbrukning för frågan baserat på de uppskattade radnumren och radstorleken. Denna förbrukningsuppskattning kan dock vara fel av olika skäl, och om frågan kräver mer minne än uppskattningen använder den tempdb-data. Denna mekanism kallas en tempdb spill och orsakar prestandaförlust., Anledningen till detta: minnet är alltid snabbare än tempdb-databasen eftersom tempdb-databasen använder diskresurserna.

Du kan se denna SQL Server 2017: SQL Sort, Spill, minne och adaptiv minne Grant Feedback fantastisk artikel för mer information om tempdb spill frågan.

uppdatera från SELECT: KOPPLINGSUTDRAGET

KOPPLINGSUTDRAGET används för att manipulera (infoga, uppdatera, ta bort) en måltabell genom att referera till en källtabell för de matchade och oöverträffade raderna. KOPPLINGSUTDRAGET kan vara mycket användbart för att synkronisera tabellen från vilken källtabell som helst.,

Nu, om vi går tillbaka till vår position, kan kopplingsutgåvan användas som en alternativ metod för att uppdatera data i en tabell med dem i en annan tabell. I den här metoden kan referenstabellen ses som en källtabell och måltabellen är tabellen som ska uppdateras. Följande fråga kan vara ett exempel på denna användningsmetod.,

1
2
3
4
5
6
7
8
9

sammanfoga personer enligt
använda(Välj * från adresslista) som addr
på addr.PersonID=Per.PersonID
när matchas sedan
UPPDATERINGSUPPSÄTTNING
Per.PersonPostCode=Addr.Postnummer,
per.PersonCityName = Addr.,Div>
välj * från personer

låt oss nu ta itu med den tidigare uppdateringen från en utvald frågelinje för rad.,

1
personer enligt

Vi har skrivit personstabellen efter sammanslagningen eftersom det är vår måltabell, som vi vill uppdatera, och vi gav per alias till den för att kunna använda resten av frågan.,

1
USING(SELECT * FROM AddressList) AS Addr

After the USING statement, we have specified the source table.

1
ON Addr.PersonID=Per.,PersonID

med hjälp av denna syntax definieras kopplingsförhållandet mellan mål-och källtabellen.

1
2

när matchas sedan
uppdateringsuppsättning per.PersonPostCode=Addr.,

i den sista raden i frågan valde vi manipulationsmetoden för de matchade raderna. Individuellt för den här frågan har vi valt uppdateringsmetoden för matchade rader i måltabellen. Slutligen lade vi till semikolon-tecknet (;) eftersom SAMMANFOGNINGSDEKLARATIONERNA måste sluta med semikolon-tecknen.

uppdatera från SELECT: subquery Method

en subquery är en interiörfråga som kan användas inuti DML-satserna (välj, infoga, uppdatera och ta bort)., Den viktigaste egenskapen hos subquery är, de kan endast utföras med den externa frågan.

subquery-metoden är den mycket grundläggande och enkla metoden för att uppdatera befintliga data från andra tabelldata. Den märkbara skillnaden i den här metoden är, det kan vara ett bekvämt sätt att uppdatera en kolumn för tabellerna som har ett litet antal rader. Nu ska vi utföra följande fråga och sedan analysera den.,

1
2
3
4

UPDATE Persons
SET Persons.PersonCityName=(SELECT AddressList.PostCode
FROM AddressList
WHERE AddressList.PersonId = Persons.,r utförandet av uppdateringen från en select-sats utgången av tabellen kommer att vara som nedan;

1
välj * från personer

som vi kan se har kolumndata för personcityname i personstabellen uppdaterats med stadskolumndata i adresslistabellen för de matchade posterna för den personliga kolumnen., När det gäller denna metod bör vi understryka följande viktiga punkter.

  • Om subquery inte kunde hitta någon matchad rad kommer det uppdaterade värdet att ändras till NULL
  • om underquery hittar mer än en matchad rad, kommer uppdateringsfrågan att returnera ett fel, vilket visas nedan:

  • många gånger underquery uppdateringsmetoden kanske inte ger tillfredsställande prestanda

slutsats

i den här artikeln lärde vi oss att uppdatera data i en tabell med data där de finns i andra tabeller., Frågestrukturen, ”UPDATE from SELECT” kan användas för att utföra denna typ av datauppdateringsscenario. Vi kan också använda alternativa KOPPLINGSUTDRAG och underkvalitetsmetoder.

  • författare
  • Senaste inlägg
Esat Erkec är en SQL Server-professionell som började sin karriär för 8 år sedan som en professionell SQL Server.mjukvaruutvecklare. Han är en SQL Server Microsoft Certified Solutions Expert.,
större delen av sin karriär har fokuserats på SQL Server databasadministration och utveckling. Hans nuvarande intressen är i databasadministration och Business Intelligence. Du kan hitta honom på LinkedIn.,
Visa alla inlägg av Esat Erkec

Senaste inlägg av Esat Erkec (se alla)
  • komma igång med SQL programmering – 3 februari 2021
  • hur man läser en exekveringsplan med alla detaljer – 28 januari 2021
  • SQL SELECT top statement Översikt och exempel – 25 januari 2021

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *