Toon posts:

[MySQL] IF NOT EXISTS INSERT INTO met MySQL < 4

Pagina: 1
Acties:
  • 248 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb al gezocht op GoT, maar ik heb nergens een oplossing gevonden.
( [rml][ mysql] insert into if not exists[/rml] )

Ik wil ik een rij invoegen als ie niet bestaat, en updaten als ie wel bestaat. Ik las dat je met MySQL >= 4.1 de syntax INSERT ... ON DUPLICATE KEY UPDATE kan gebruiken.
De doel-webserver waar de applicatie op gaat draaien heeft MySQL 3.23.xx draaien en ik kan die oplossing voor MySQL 4.1 dus niet gebruiken...

Tabelstructuur:
SQL:
1
2
3
4
5
6
7
8
9
CREATE TABLE `shop_product_value_combos` (
  `id` int(10) NOT NULL auto_increment,
  `rel_prod_id` int(10) NOT NULL default '0',
  `rel_value_id` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;

INSERT INTO `shop_product_value_combos` VALUES (1, 1240, 3);
INSERT INTO `shop_product_value_combos` VALUES (2, 1240, 5);


Vanuit PHP heb ik de volgende query geprobeerd (met een paar combinaties):
SQL:
1
2
3
4
5
IF (SELECT COUNT(*) FROM shop_product_value_combos WHERE rel_prod_id='1240' AND rel_value_id='3')=0 THEN 
  INSERT INTO shop_product_value_combos (rel_prod_id, rel_value_id) VALUES ('1240', '3') 
ELSE 
  UPDATE shop_product_value_combos SET rel_prod_id='1240', rel_value_id='3') 
END IF

Ik krijg de volgende error:
SQL:
1
You have an error in your SQL syntax near 'IF (SELECT COUNT(*) FROM shop_product_value_combos WHERE rel_prod_id='1240' AND r' at line 1


Ik ga er dus vanuit dat die IF()-syntax die ik gebruik niet ondersteund wordt door MySQL 3.23.xx, klopt dit?
Hoe kan ik dit het beste oplossen?

edit:
Query veranderd van PHP naar SQL

[ Voor 79% gewijzigd door Verwijderd op 10-09-2004 12:16 ]


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Wat jij doet is PL/SQL, en dat wordt inderdaad niet ondersteund in mysql<4.
Ik kan niet echt wijs worden uit je query (waarom paste je je php-code en niet je query? dat is echt stukken leesbaarder.) dank je...

Heb je niets aan INSERT IGNORE of REPLACE?


In mysql<3 is dit probleem iirc alleen op te lossen met twee queries. Gelukkig is het vanwege de aard van de queries niet nodig om dit in een transaction te vrotten.

INSERT INTO [tabel] (key1,key2) Values ( waarde,waarde )
UPDATE [tabel] SET [...] WHERE key1 = waarde AND key2=waarde

Zorg er voor dat je in je insert ALLEEN je unique/primary key velden invult.
edit:
Toevoegingen

[ Voor 50% gewijzigd door kvdveer op 10-09-2004 11:16 ]

Localhost, sweet localhost


Verwijderd

Topicstarter
Probleem is dat ik moeilijk moet doen om aan aan de PRIMARY KEY te komen (de id) of anders los met een SELECT op moet halen.

De combinaties zijn uniek, dus ik kan niet de andere twee kolommen een UNIQUE index geven.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

http://dev.mysql.com/doc/mysql/en/REPLACE.html

REPLACE kan doen wat jij wilt....

Programmer - an organism that turns coffee into software.


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Verwijderd schreef op 10 september 2004 @ 11:22:
Probleem is dat ik moeilijk moet doen om aan aan de PRIMARY KEY te komen (de id) of anders los met een SELECT op moet halen.

De combinaties zijn uniek, dus ik kan niet de andere twee kolommen een UNIQUE index geven.
Kun je iets uitwijden? De queries die ik gaf zijn geschikt voor meervoudige keys, keys waarvan de combinatie dus uniek is...

REPLACE kun je gebruiken als je record geen velden bevat die niet geupdated worden, anders niet.

Localhost, sweet localhost


Verwijderd

Topicstarter
Als ik REPLACE gebruik:
SQL:
1
2
REPLACE INTO shop_product_value_combos SET rel_prod_id='1240', rel_value_id='5'
REPLACE INTO shop_product_value_combos SET rel_prod_id='1240', rel_value_id='3'
Dan worden er twee nieuwe toegevoegd, dat wil ik niet, want de combinaties (1240,5) en (1240,3) bestaan al in de tabel.

Hoe kan ik dit dan doen?

Overigens kan ik alleen maar de PRIMARY KEY id weten als ik een bestaande rij REPLACE. Vaak moeten er rijen worden toegevoegd en dan weet ik de id dus helemaal niet.

[ Voor 27% gewijzigd door Verwijderd op 10-09-2004 11:52 ]


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Heb je wel een unique constraint toegevoegd in de tabel?
Twee keer dezelfde combinatie hoor je namelijk niet toe te kunnen voegen als je constraints (indexes in mysql) goed staan.

Localhost, sweet localhost


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

REPLACE werkt alleen als je een record met hetzelfde ID in probeert te voegen. IMHO had je dit net zo makkelijk in PHP op kunnen lossen, waarom moet dit zo nodig in 1 query? Lijkt me niet dat je dit 100x per keer moet doen in een script, dus tijd zal het niet schelen. :)

'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

Topicstarter
Ik wil de database load zo veel mogelijk beperken. Ik laat de gebruiker een productlijst in 1x updaten, dus er is sowieso 1 query per product update.
Daarnaast gaat het hier om optionele eigenschappen per product, die door de gebruiker kunnen worden bepaald.
Er komen zeker wel lijsten van 100 of meer producten voor. Vandaar dat ik het zo efficiënt mogelijk wil doen.

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 06-05 13:07
Niet dat je er veel aan hebt ofzo..
Maar is er gewoon niet een mogelijkheid dat je die MySQL versie update? zodat je 't jezelf niet zo moeilijk hoeft te maken?

Of desnoods laat doen, als 't niet jou server is...

Verwijderd

Topicstarter
kvdveer schreef op 10 september 2004 @ 14:28:
Heb je wel een unique constraint toegevoegd in de tabel?
Twee keer dezelfde combinatie hoor je namelijk niet toe te kunnen voegen als je constraints (indexes in mysql) goed staan.
Hoe moeten mijn indexes dan staan?

Bij REPLACE:
Met een UNIQUE index op de id INSERT ie twee duplicaatrijtjes, met een UNIQUE index op de 2 kolommen rel_prod_id en rel_value_id vervangt ie de rijen goed, alleen verandert ie de id en dat moet ik natuurlijk niet hebben.

Verwijderd

Topicstarter
Crazybyte schreef op 10 september 2004 @ 15:13:
Niet dat je er veel aan hebt ofzo..
Maar is er gewoon niet een mogelijkheid dat je die MySQL versie update? zodat je 't jezelf niet zo moeilijk hoeft te maken?

Of desnoods laat doen, als 't niet jou server is...
Ik heb zelf geen toegang tot het beheer van de webserver, providers doen over het algemeen moeilijk volgens mij over het updaten van PHP of MySQL...
Toen ik het vroeg aan een andere webhosting service vandaag zei ie dat MySQL 4.x nog niet stable was op de Feudora distro, vandaar dat ie dat niet wou updaten. :(

Ik haat het als je je in een hoekje van moeilijkheden moet werken omdat de techniek onnodig achterloopt.... bah :(
Pagina: 1