Üdv mindeninek,
Sajnos nem vagyok SQL expert ezért egy kis segítséget szeretnék kérni mysql ügyben.
Adatot gyűjtök adatbázisba és sokszor előfordul, hogy az időközönként kapott adat nem új adat hanem az előző.
Szeretném elkerülni azt, hogy ilyen esetekben többszörösen legyen ugyanaz az adat az adatbázisban.
Arra gondoltam, hogy a REPLACE INTO segítségével ez megoldható.
CREATE TABLE testing (city INT, date DATETIME, value FLOAT) ENGINE=MyIsam DEFAULT CHARSET=UTF8;
REPLACE INTO testing (city,date,value) VALUES (35,'2012-11-30 21:00:00',3.81);
REPLACE INTO testing (city,date,value) VALUES (35,'2012-11-30 21:00:00',3.81);
SELECT * FROM testing;
+------+---------------------+-------+
| city | date | value |
+------+---------------------+-------+
| 35 | 2012-11-30 21:00:00 | 3.81 |
| 35 | 2012-11-30 21:00:00 | 3.81 |
+------+---------------------+-------+
Látszólag duplikálódnak az adatok pedig ha már létezik egy megegyező rekord akkor nem kellene...
Én gondolom rosszul a REPLACE működését vagy rosszul csinálok valamit?
A válaszokat előre is köszönöm.
- 5145 megtekintés
Hozzászólások
A replace into egyedi kulcs egyezés esetén cserél csak, egyébként insert történik. RTFM :)
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
Ha pedig létezik és jól van eltalálva a kulcs, felesleges X-et X-re cserélni REPLACE INTOval, mehet az INSERT INTO.
- A hozzászóláshoz be kell jelentkezni
Igen, csak akkor Duplicate key entry kezdetű hibaüzenettel szembesülsz, hacsak nem használod az ON DUPLICATE KEY clause-t.
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
Mi tagadás, inkább DBA oldalról nézem ezt, nem fejlesztőiről (a fejlesztó kezelje le a hibakódot): ha X-et X-re cserélek a bufferpoolban/OS cache-ben, az dirty bit lesz adat- és indexlapon egyaránt, ami felesleges lemezszinket fog eredményezni, míg ha megpróbálok beszúrni, akkor csak az indexbe pillantok, hibakódot dobok, és megyek tovább.
- A hozzászóláshoz be kell jelentkezni
Jogos, de nem akartam belemenni a kivételkezelésbe :)
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
Eszembe jutott. Írhatsz olyat, hogy INSERT IGNORE INTO... Ilyenkor kulcsduplikáció esetén nem történik semmi. MySQL tutira tudja. A világ megmenekült :)
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
Nu, máris tanultam vmit, ami felénk nincs. Kösz!
- A hozzászóláshoz be kell jelentkezni
Szívesen :)
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
Köszönöm a választ. Sejtettem, hogy a hiányos ismereteim miatt nem csinálok jól valamit.
Ebben az esetben már úgy működik ahogy vártam:
CREATE TABLE testing (city INT, date DATETIME, value FLOAT, UNIQUE (city,date,value) ) ENGINE=MyIsam DEFAULT CHARSET=UTF8;
--
maszili
- A hozzászóláshoz be kell jelentkezni
szvsz, inkabb insert into on duplicate keyt hasznalj, mert a replace az egy atomi delete+insert!
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
+1
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
DB400-on működik így is:
INSERT INTO testing (city,date,value) select 35, '2012-11-30 21:00:00', 3.81 from testing where (city,date,value) = (35, '2012-11-30 21:00:00', 3.81) having count(*) = 0;
- A hozzászóláshoz be kell jelentkezni