Toon posts:

[mysql 3.x] INSERT ... SELECT constructie werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Je zou denken dat een syntax error simpel op te lossen is. Maar dit heeft me nu toch al wel een paar uur gekost, zonder resultaat.
SQL:
1
2
3
4
5
6
7
8
INSERT INTO uren (gebruiker, project, datum, #uur)
SELECT uren_b.gebruiker,
       uren_b.project,
       uren_b.datum,
       uren_b.#uur
FROM uren_b
WHERE uren_b.gebruiker = $user
AND uren_b.project = $project

Ok, deze code geeft een syntax error:
You have an error in your SQL syntax near 'SELECT uren_b.gebruiker, uren_b.project' at line 2
Hij geeft dus aan dat de fout hem waarschijnlijk in de regel daarvoor zit.

Het is niet de fieldnaam #uur die fout is. Dat werkt namelijk ook in andere queries.

Het lijkt wel alsof MySQL de INSERT SELECT constructie niet ondersteunt. Ik gebruik MySQL 3.23.58. De manual zegt echter niets over een beperking, behalve dat je in het SELECT gedeelte niet dezelfde tabel mag gebruiken als die je in het INSERT gedeelte gebruikt. Dat doe ik niet.

Google helpt mij niet veel verder, aangezien 'you have an error in your sql syntax' nogal vaak voorkomt, er niks over 'MySQL 3.23.58' wordt gezegd en 'INSERT SELECT' ook niet veel bruikbaars oplevert.

Via Google vind ik wel een site die vrij uitgebreid uitlegt wat er vreemd is aan MySQL ten opzichte van SQL: http://sql-info.de/mysql/gotchas.html#1_8 Deze zegt alleen ook niets over mijn situatie.

Ik heb ook in de FAQ gekeken hier op GoT, maar die zegt alleen dat INSERT SELECT de enige subquery is die wél wordt ondersteund in MySQL.

Kortom, ik weet niet waar de fout zit. Kan iemand mij helpen?

offtopic:
Mijn vorige topic met betrekking tot mysql werd vrij snel gesloten met de mededeling dat syntax errors zelf moeten worden oplgelost, en dat de topicstart langer moet. Bij deze overtreed ik dus het eerste, maar ik heb dit keer nog beter gezocht dan de vorige keer en ik kom er toch niet uit.

  • Speedener
  • Registratie: September 2000
  • Laatst online: 15:14
; (puntcomma) aan het einde van regel 1?

Edit 1: En anders snap ik helemaal niet wat je wilt :+

Edit 2: En mocht je hiermee proberen een subquery constuctie te maken. Subquerys worden vanaf mysql 4.nogwat pas ondersteund volgens mij.

[ Voor 85% gewijzigd door Speedener op 20-01-2006 19:22 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22:07

NMe

Quia Ego Sic Dico.

INSERT .. SELECT queries wordt ook nog niet zo lang ondersteund. Volgens mij pas vanaf MySQL 4.0, maar dat kan ik zo snel ook nergens terugvinden. Afgezien van die lelijke veldnaam #uur zie ik verder ook niks geks aan je query. :?

offtopic:
Als je zo'n gekke veldnamen gebruikt kun je er beter backticks ( ` ) omheen zetten, dan weet je zeker dat die veldnaam niet voor problemen zorgt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 14-04 22:52

DDemolition

slopen is mijn lust en leven

Ik zou idd een puntkomma zeggen.
Je kunt bv. proberen om de 2 appart te proberen en bv. een
echo $SQL; kunnen geven wat ik persoonlijk altijd doe.

Verder vindt MySQL het wel altijd fijn als je '$value' geeft ipv. $value.

Specs: Server, WS boven, WS beneden


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22:07

NMe

Quia Ego Sic Dico.

Voor de mensen hierboven die roepen dat er een puntkomma bij moet: lees dit even door. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

-NMe- schreef op vrijdag 20 januari 2006 @ 19:35:
offtopic:
Als je zo'n gekke veldnamen gebruikt kun je er beter backticks ( ` ) omheen zetten, dan weet je zeker dat die veldnaam niet voor problemen zorgt.
Nauwelijks offtopic hoor:
Uit de documentatie ( http://dev.mysql.com/doc/refman/5.0/en/legal-names.html ):
If an identifier is a reserved word or contains special characters, you must quote it whenever you refer to it.

Bij mij valt de '#' in de categorie special characters.

Verwijderd

Topicstarter
Bedankt voor alle reacties. Ik heb de code nu veranderd.

SQL:
1
2
3
4
5
6
7
8
INSERT INTO `uren` ( `gebruiker`, `project`, `datum`, `#uur` )
SELECT `gebruiker`,
       `project`,
       `datum`,
       `#uur`
FROM `urenadministratie_ghost`
WHERE `gebruiker` = $user
AND `project` = $project

Dit werkt wel! Ik heb die backticks erin gegooid, maar toen deed-ie het nog niet. Toen kwam ik op het idee om de tabel-identifiers eruit te halen. Dat bleek het uiteindelijk te zijn. Nu werkt het probleemloos.
DDemolition schreef op vrijdag 20 januari 2006 @ 19:40:
Ik zou idd een puntkomma zeggen.
Je kunt bv. proberen om de 2 appart te proberen en bv. een
echo $SQL; kunnen geven wat ik persoonlijk altijd doe.

Verder vindt MySQL het wel altijd fijn als je '$value' geeft ipv. $value.
In de echte code gebruik ik de manier van:
PHP:
1
$query = "SQL-code '" . $variable . "'";

Voor de leesbaarheid heb ik de php code eruit gehaald en de database-namen versimpeld.

Bedankt voor alle hulp! :)

[ Voor 3% gewijzigd door Verwijderd op 20-01-2006 20:49 ]


  • Snow_King
  • Registratie: April 2001
  • Laatst online: 15-04 11:12

Snow_King

Konijn is stoer!

Misschien wat offtopic, maar waarom draai je nog de 3.x serie?

Welke beweegreden zit daar achter?

[ Voor 24% gewijzigd door Snow_King op 21-01-2006 15:22 ]


Verwijderd

Voor de volledigheid: # is voor mysql het "comment" teken, dus de rest van de query lijn werd niet geparsed, vandaar syntax error.

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Snow_King schreef op zaterdag 21 januari 2006 @ 15:22:
Misschien wat offtopic, maar waarom draai je nog de 3.x serie?

Welke beweegreden zit daar achter?
sommige "hosting providers" bieden niks beters aan :X

edit:

omdat ik hier niet nog een post aan wil verspillen reageer ik zo eventjes :)
Snow_King schreef op zaterdag 21 januari 2006 @ 16:23:
Dat is niet echt meer van deze tijd.
true, maar helaas zijn er nog steeds dergelijke aanbieders die alleen maar geld binnen halen, en helaas zijn de mensen die daar hun site hebben niet te overtuigen om daar weg te gaan :/

[ Voor 46% gewijzigd door Erkens op 21-01-2006 16:32 ]


  • Snow_King
  • Registratie: April 2001
  • Laatst online: 15-04 11:12

Snow_King

Konijn is stoer!

Erkens schreef op zaterdag 21 januari 2006 @ 15:38:
[...]

sommige "hosting providers" bieden niks beters aan :X
Dat is niet echt meer van deze tijd.

Maar ik zal verder niet meer offtopic gaan.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op vrijdag 20 januari 2006 @ 20:46:
Dit werkt wel! Ik heb die backticks erin gegooid, maar toen deed-ie het nog niet. Toen kwam ik op het idee om de tabel-identifiers eruit te halen. Dat bleek het uiteindelijk te zijn. Nu werkt het probleemloos.
Dat deed je dan niet goed... dus niet ala `uren`.`veld` maar als `uren.veld` ?

Verwijderd

Topicstarter
Ik deed inderdaad `uren.veld`. Het moet dus `uren`.`veld` zijn? Ik dacht dat ` gewoon parsing verhinderde, dus net zoiets als ' in PHP.

Maar nu werkt het ook, zonder tabel identifier. Er is namelijk geen ambiguïteit als je één tabel gebruikt om te selecteren.

[ Voor 3% gewijzigd door Verwijderd op 21-01-2006 17:33 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

De ` wordt gebruikt om een identifier aan te geven met bijzondere tekens er in. Spaties, rare dingen als die # etc. Het is bijzonder verstandig ze niet te gebruiken, maar als je ze dan per se moet gebruiken moet je het per identifier apart doen.
uren.`raar veld` is dus ook een mogelijkheid. Maar `uren.raar veld` verwijst naar de identifier "uren.raar veld" omdat ook de . onderdeel van de identifier is door die backticks.

Overigens wijkt MySQL af van de SQL-specificatie hierin, die stelt dat je double-quotes ( " ) hoort te gebruiken.
Pagina: 1