![]() |
Mysql - stored procedures (hierarkisk data)
Hej alla!
Har hyfsad koll på mysql, men stored procedures är lite nytt för mig. Jag vet inte hur jag ska börja med följande problem. Jag ska spara en katalogstruktur enl nedanstående klassiska exempel: Katalog id - int parent_id - int name - varchar Jag vill med hjälp av en SP spara en hel sökväg i databasen. Om delar av databasen redan finns så ska den uppdatera den. Exempelvis om sökvägen /människor/man/petter ska sparas men /människor redan finns så ska människor lämnas orörd och bara uppdateras med /man/petter. Slutligen vill jag returnera id'd på petter (dvs lövet på grenen). Någon som har tips om hur jag kan gå tillväga? Syftet med detta är att ta bort en del av logiken från PHP för att på så vis spara lite tid genom att bara skicka en fråga till databasen. |
Jag har inte en komplett lösning men lite procedurer och funktioner på vägen...
Kod:
delimiter $$ Kod:
delimiter $$ Kod:
delimiter $$ Slutligen lite testkod hur man använder dessa.... Kod:
delimiter ; |
Här är ett förslag på lösning av proceduren Storestructure() med lite testkod. Det finns massor av optimeringar att göra om man vill det, men det har jag inte ens funderat på ännu. Detta löser i vart fall TS problem, om jag fattat det rätt.
Jag har kört med MySQL Workbench CE for Windows version 5.2.47 revision 10398. SHOW VARIABLES LIKE "%version%"; -- Ger följande resultat.... innodb_version 1.1.8 protocol_version 10 slave_type_conversions version 5.5.29 version_comment MySQL Community Server (GPL) version_compile_machine x86 version_compile_os Win32 DDL-script för tabellen "katalog": Kod:
delimiter $$ SP: StoreStructure() Kod:
-- -------------------------------------------------------------------------------- Testkod: Kod:
use wn; |
Om du vill radera alla poster i tabellen katalog så måst eman ta bort dem underifrån eftersom det är en forreign key constreint mellan parent_id och id i tabellen.
Jag slängde ihop en SP som fixar borttag av alla tuplerna på ett enkelt sätt: Kod:
-- -------------------------------------------------------------------------------- |
Jisses Conny! Är det någon som lägger ordentligt med tid på att svara på frågor så...
Ska analysera det hela lite närmare och testa lite under kvällen. STORT tack för detta! |
Citat:
Jag gillar såna här problem att lösa, det är som att lösa korsord eller en SUDOKU... Det ger mig även chansen att sätta mig in i databasen MySQL och det var ett antal brister i databasen som gjorde att jag bland annat fick förkasta ett par alternativa lösningar. Bland annat så saknar MySQL möjligheten att skapa tabeller som variabler och returnera det från s.k. Table-value-functions vilket man kan i MS SQL. Så det gör att man måste använda temporära memory-tabeller i stället, vilket är besvärligare. Det skulle säkert sparat 50-75 procent av koden. Sen hade jag en variant med en SQL Cursor som jag fick förkasta för jag fick aldrig ordning på hur cursorn. Men med tre nivåer i en struktur så tar det 16 ms att köra StoreStructure() på min gamla Lenovo T410 så det får väl vara godkända prestanda tills vidare, med tanke på att jag inte gjort några optimeringar alls ännu. |
Slängde även ihop en testprocedur:
Kod:
delimiter $$ Kod:
delimiter $$ |
Citat:
|
I MSSQL har man även tabled valued functions och då skulle jag kunnat åstadkomma detta på några enstaka rader SQL-kod.
MSSQL kan man ju köra en string.split och returnera table value... Då blir det väl typ 2 rader kod eller så.... |
Tack alla för alla svar!
Jag har lagt logiken i min PHP-kod istället, får värma upp mig lite på stored procedures först innan jag använder det. |
Alla tider är GMT +2. Klockan är nu 06:36. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson