evilaidMedlem sedan apr. 2009433 inlägg Hej igen...
satt och funderade lite..
om jag loopar igenom massa fält som skickats från en webbsida och ska för varje fält uppdatera respektive post i databasen. Hur gör jag då om ett fält inte har en post i databasen? Kan man på något sätt ha ett villkor där man kör en update och finns inte posten ska det köra en insert?
Det är så att dte kommer att kanske vara 100 olika fält på sidan och varje fält ska loopas igenom för att skrivas till databasen. Tänkte att fältets namn är desamma som id'et i databasen och då ska värdet från fältet uppdateras i databasen?
Eller ska man för varje fält först kolla om det id'et existerar i databasen, och om det gör det köra en update eller insert fråga? Känns som att det blir rätt tungt att göra så eller??
som sagt, detta är bara i tankestadiet så har inge kod att visa hur jag tänkt mig men kan ju vara bra att ha lite grund innan man sätter igång :)
Mvh
Det här brukar jag köra:
INSERT INTO tabell
(field1, field2, field3)
VALUES
(
1, 'foo', 'bar'
)
ON DUPLICATE KEY UPDATE
field2 = 'bar',
field3 = 'foo'
Det "bygger" på att du har en nyckel (t.ex. primärnyckel eller ett unikt fält) och när det blir en "krock" så uppdateras valfria fält istället för att läggas till.
Du skriver inte vilken DBMS du använder men ovanstående funkar kanon i MySQL.
/r ...och dokumentationen såklart:
http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
evilaidMedlem sedan apr. 2009433 inlägg A sorry, Skulle självklart skriva att det är MSSQL jag använder...
Tror du koden fugerar för det också?
Funktionen verkar ju klockren, precis som jag tänkt.. Jag använder mig av en primärnyckel så det är inga problem, då gäller det bara att hitta kod som fungerar för MSSQL?
evilaid skrev:
...då gäller det bara att hitta kod som fungerar för MSSQL?
Eftersom inte du orkade Googla, så gjorde jag det åt dig:
http://msdn.microsoft.com/en-us/library/bb522522.aspx
Verkar alltså inte finns exakt samma sak, men däremot finns det något som heter MERGE...WHEN MATCHED....
evilaidMedlem sedan apr. 2009433 inlägg Hahha bussig att du han söka först ;)
Jag har läst följande kod ett par gånger nu utan att blir klok på den:
MERGE dbo.FactBuyingHabits AS Target
USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source
ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID)
WHEN MATCHED THEN
UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate
WHEN NOT MATCHED BY TARGET THEN
INSERT (CustomerID, ProductID, LastPurchaseDate)
VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate)
OUTPUT $action, Inserted.*, Deleted.*;
Och det här med merged fattar jag inte, vad jag förstår som så i ovan kod hämtas data från en tabell och flyttas till en annan. "When Matched" förstår jag men inte koden innan. Jag har ju bara en tabell med följande fält: id, discount..
försöka google lite till och se om det finns någon mer lättförstålig kod :)
Här är ett bättre exempel:
http://codingsense.wordpress.com/2008/12/23/bulk-insert-and-update-mssql/
Annars bör det gå att joina "den egna" tabellen och använda sig av metoden i tidigare länk.
evilaidMedlem sedan apr. 2009433 inlägg OK. är kommer en fråga som kan vara rätt dum..
All SQl kod skrivs ju så olika, ibalnd står det trans-SQL, stored procedure m.m. Men detta är väll inte samma som det jag använder på mina asp sidor när jag skickar en sql fråga?
En STORED PROCEDURE kan man jämföra med en funktion i t.ex. ASP, alltså ett stycke sql frågor fast som lagras i databasen. Den här "funktionen" kan man sedan anropa från din ASP kod.
evilaidMedlem sedan apr. 2009433 inlägg ok, men vad är skillnaden på Transact-SQL och vad kallas det när man bara skickar en Sql med asp kod?
newseedMedlem sedan maj 2010117 inlägg Jag skulle köra UPDATE först och sedan läsa hur många rader som påverkades. Om du gör UPDATE för en rad så borde du då få svar att en rad har påverkats. Har inga rader påverkats så kör INSERT. Du slipper då börja med att först kolla vilka som finns och vilka som inte finns.
Detta tillvägagångssätt blir dock ineffektivt om INSERT är mycket vanligare än UPDATE.
evilaidMedlem sedan apr. 2009433 inlägg Men det kan ju vara så att 5 rader uppdateras men att jag har 10 fält.. måste väll veta vilka fem som inte fanns och köra inserts på dessa??
Det där med Merge verkar vettigt, men har inte riktigt klurat ut hur jag ska få till koden..
newseedMedlem sedan maj 2010117 inlägg Du måste göra varje update och insert var för sig enligt mitt förslag. Här kommer exempel i pseudo-kod:
foreach data in uppdatering{
rows = update_fields( data );
if ( rows == 0 ){
insert_fields( data );
}
}
Jag vet inte vilket programmeringsspråk du använder men detta bör gå att lösa i de flesta språk / databaser.