"Beräkningsfält" i MySQL?

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2004-09-30 21:07

Jag skulle precis som i FileMaker behöva ha motsvarande "Beräkningsfält" i MySQL. När ett nytt record skapas i MySQL vill jag att veckonumret - SELECT WEEK(CURDATE(),3); - automatiskt fylls i i ett fält. Det borde gå, eller?

Nej, det vagt sql-likande språk som MySQL använder tillåter inte funktionsanrop som DEFAULT-värden, utan det enda du kan göra är att använda en timestamp-/date-kolumn och extrahera informationen vid varje SELECT-sats i stället. Bästa lösningen är annars att byta till en riktig databashanterare

Dock kan man få timestamp-kolumner i MySQL att anta aktuellt klockslag med det bisarra "DEFAULT 'NOW()'"-tricket, som går ut på att ha en godtycklig men helt ogiltig tidsangivelse som DEFAULT-värde på en datumkolumn. Den ogiltiga tidsangivelsen får MySQL att sparka bakut men eftersom den inte är som andra barn rapporterar den inte felet och avbryter, utan antar på egen hand ett lämpligt värde och petar in det i stället. Det är ett sådant gräsligt fulhack att det sticker i ögonen, men det fungerar iaf hjälpligt...

  • Medlem
  • Stockholm
  • 2004-10-04 08:18
Ursprungligen av Samuel K:

... Dock kan man få timestamp-kolumner i MySQL att anta aktuellt klockslag med det bisarra "DEFAULT 'NOW()'"-tricket, som går ut på att ha en godtycklig men helt ogiltig tidsangivelse som DEFAULT-värde på en datumkolumn. Den ogiltiga tidsangivelsen får MySQL att sparka bakut men eftersom den inte är som andra barn rapporterar den inte felet och avbryter, utan antar på egen hand ett lämpligt värde och petar in det i stället. Det är ett sådant gräsligt fulhack att det sticker i ögonen, men det fungerar iaf hjälpligt...

Va? Jag trodde det var tänkt att funka så! Det framställs åtminstone så i diverse informationskällor... Förhoppningsvis inte i MySQL-manualen i så fall...

Menar du att man lika gärna skulle kunna skriva typ DEFAULT FINNSINTE() och få samma resultat?

Ursprungligen av HL:

Va? Jag trodde det var tänkt att funka så! Det framställs åtminstone så i diverse informationskällor... Förhoppningsvis inte i MySQL-manualen i så fall...

Menar du att man lika gärna skulle kunna skriva typ DEFAULT FINNSINTE() och få samma resultat?

I tidigare versioner har liknande trick iaf fungerat, men lat som jag är har jag inte kommit mig för att testa på sistone. Men även i nyaste versionerna av MySQL är det "hitta-själv-på-ett-värde"-principen som gör att DEFAULT NOW() fungerar; det görs alltså inga anrop till NOW()-funktionen, utan det är den underliga felhanteringen som sätter värdet. Det är f.ö. därför det inte går att ange andra "funktionsanrop" som DEFAULT-värde, och även därför som det inte fungerar att ange t.ex. "NOW + INTERVAL('1 week')".

  • Medlem
  • Stockholm
  • 2004-09-30 23:08

Om du skapar dina records via php-script så klarar du dig med MySQL ett tag till då du kan efterlikna funktionsanrop som defaultvärden, php-funktionsanrop.

$sql = "INSERT INTO table(date) VALUES (" . date('W') . ")";
mysql_query($sql);
  • Medlem
  • International user
  • 2004-09-30 23:22

Ungefär som med "ren" MySQL:

INSERT INTO tbl_1 (datum,vecka) VALUES('2004-09-30',WEEK(datum,3));
  • Medlem
  • International user
  • 2004-09-30 23:52

Lösning på mitt problem: Eftersom jag inte kan styra SQL-strängen vid skapandet av recordet men vet ID:t, kan jag uppdatera recordet med önskat resultat:

UPDATE tbl_1 SET vecka=WEEK(datum,3) where ID=2;
1
Bevaka tråden