MySQL-import z .dbf
Zientek - 27-12-2005 10:17
MySQL-import z .dbf
Witam, Mam tabelkę product_code o definicji jak niżej (MySql). Tłumaczy ona kody produktów pomiedzy bazą, a danymi z programu magazynowego (.dbf). Potrzebuję okresowo importować nowe wpisy z dbf'a, przy czym mogą one mieć już istniejące identyfikatory. Zależy mi na INSERCIE jeśli wpisu jeszcze nie ma, a na UPDACIE jeżeli już jest. Niestety nie znalazłem dobrego rozwiązania dla mysql. Odpowiednika składni: MERGE... WHEN EXISTS UPDATE... ELSE INSERT... z Oracla nie znalazłem.
Z góry dzięki za pomoc, Pozdrawiam zientek
CREATE TABLE `shop`.`product_code` ( `product_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `product_code` INT(11) UNSIGNED NOT NULL, PRIMARY KEY(`product_id`), UNIQUE INDEX `product_code_product_code_i`(`product_code`) ) TYPE = InnoDB COMMENT = 'Tłumacz kodów produktów, na kody z zewnętrznej bazy.';
Slawomir Cichy - 27-12-2005 10:17
Zientek wrote: > Witam, > Mam tabelkę product_code o definicji jak niżej (MySql). Tłumaczy ona kody > produktów pomiedzy bazą, a danymi z programu magazynowego (.dbf). > Potrzebuję okresowo importować nowe wpisy z dbf'a, przy czym mogą one mieć > już istniejące identyfikatory. Zależy mi na INSERCIE jeśli wpisu jeszcze > nie ma, a na UPDACIE jeżeli już jest. Niestety nie znalazłem dobrego > rozwiązania dla mysql. Odpowiednika składni: > MERGE... > WHEN EXISTS UPDATE... > ELSE INSERT... > z Oracla nie znalazłem. > > Z góry dzięki za pomoc, > Pozdrawiam > zientek > > CREATE TABLE `shop`.`product_code` ( > `product_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, > `product_code` INT(11) UNSIGNED NOT NULL, > PRIMARY KEY(`product_id`), > UNIQUE INDEX `product_code_product_code_i`(`product_code`) > ) > TYPE = InnoDB > COMMENT = 'Tłumacz kodów produktów, na kody z zewnętrznej bazy.'; >
Pewnym substytutem moze byc wykorzystanie polecenia LOAD DATA w opcja REPLACE
Przyklad dla tabeli: CREATE TABLE `test` ( `str` varchar(30) NOT NULL default '', `str1` varchar(30) default NULL, PRIMARY KEY (`str`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
LOAD DATA LOCAL INFILE '~root/data.dbf' REPLACE INTO TABLE test FIELDS TERMINATED BY ';';
format danych w pliku
wart1; wart2 wart2; wart1 wart3; wart2 wart4; wart3 wart5; wart4
Piotr =?iso-8859-2?Q?Kuli=F1ski?= - 27-12-2005 10:18
Roku Pańskiego 2005, na pl.comp.bazy-danych, człowiek (??) *Slawomir Cichy* napisał(a):
> Zientek wrote: >> Witam, >> Mam tabelkę product_code o definicji jak niżej (MySql). Tłumaczy ona kody >> produktów pomiedzy bazą, a danymi z programu magazynowego (.dbf). >> Potrzebuję okresowo importować nowe wpisy z dbf'a, przy czym mogą one mieć >> już istniejące identyfikatory. Zależy mi na INSERCIE jeśli wpisu jeszcze >> nie ma, a na UPDACIE jeżeli już jest. Niestety nie znalazłem dobrego >> rozwiązania dla mysql. Odpowiednika składni: >> MERGE... >> WHEN EXISTS UPDATE... >> ELSE INSERT... >> z Oracla nie znalazłem. >> >> Z góry dzięki za pomoc, >> Pozdrawiam >> zientek >> >> CREATE TABLE `shop`.`product_code` ( >> `product_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, >> `product_code` INT(11) UNSIGNED NOT NULL, >> PRIMARY KEY(`product_id`), >> UNIQUE INDEX `product_code_product_code_i`(`product_code`) >> ) >> TYPE = InnoDB >> COMMENT = 'Tłumacz kodów produktów, na kody z zewnętrznej bazy.'; >> > > Pewnym substytutem moze byc wykorzystanie polecenia LOAD DATA w opcja > REPLACE > > Przyklad dla tabeli: > CREATE TABLE `test` ( > `str` varchar(30) NOT NULL default '', > `str1` varchar(30) default NULL, > PRIMARY KEY (`str`) > ) ENGINE=MyISAM DEFAULT CHARSET=latin1; > > LOAD DATA LOCAL INFILE '~root/data.dbf' REPLACE INTO TABLE test FIELDS > TERMINATED BY ';'; > > format danych w pliku > > wart1; wart2 > wart2; wart1 > wart3; wart2 > wart4; wart3 > wart5; wart4
Ciekawe.. od kiedy format pliku dbf jest "podzielony" średnikami ?, zapominasz o nagłówku pliku dbf. .... można wykorzystać ODBC do utworzenia źródła plików do importu. Niestety z moich (nie przeczę krótkich testów) wynika że przekłamywane są pola numeryczne. Osobiście sam sobie napisałem programik do tworzenia plików właśnie w podobym formacie jak to napisałeś wyżej: każdy wiersz to rekord, w rekordzie pola oddzielone separatorem, dodatkowo tworzony jest plik typu ..sql, który zawiera instrukcję tworzenia tabeli i dołączani (LOAD DATA...)rekordów z utworzonego zbioru(ów) tekstowych. Jedyny mankament (dość upierdliwy) to niemożność przerzucania pól typu MEMO. Nie potrzebowałem tego więc nie dopisałem :( Jeśli nie znajdziesz innego rozwiązania to mogę podesłać programik na priv. -- pozdrawiam piotr, gg i skype w X-nagłówku posta, e-mail: zmień "wpw" na "wp" Nic nie stoi na przeszkodzie, co by sobie przeszkody nie stworzyć :)
Bartosz 'briest' Stepien - 27-12-2005 10:18
Mistrz Zientek rzekł: > już istniejące identyfikatory. Zależy mi na INSERCIE jeśli wpisu jeszcze > nie ma, a na UPDACIE jeżeli już jest. Niestety nie znalazłem dobrego > rozwiązania dla mysql.
Może REPLACE?
REPLACE works exactly like INSERT, except that if an old record in the table has the same value as a new record for a PRIMARY KEY or a UNIQUE index, the old record is deleted before the new record is inserted. (...) REPLACE is a MySQL extension to the SQL standard.
-- Świat gryzoni jest brutalny i pełen wzajemnej nienawiści.
Slawomir Cichy - 29-12-2005 14:33
Piotr Kuliński wrote: > > Ciekawe.. od kiedy format pliku dbf jest "podzielony" średnikami ?, > zapominasz o nagłówku pliku dbf. > ...
Oczywiscie, ze nie zapomnialem, ale wydawalo mi sie, ze format .dbf jest takim prostym formatem, ze stworzenie odpowiedniego konwerotora nie powinno sprawic wiekszego problemu ;)
Zientek - 29-12-2005 14:33
Bartosz 'briest' Stepien wrote:
> Mistrz Zientek rzekł: >> już istniejące identyfikatory. Zależy mi na INSERCIE jeśli wpisu jeszcze >> nie ma, a na UPDACIE jeżeli już jest. Niestety nie znalazłem dobrego >> rozwiązania dla mysql. > > Może REPLACE? > > REPLACE works exactly like INSERT, except that if an old record in > the table has the same value as a new record for a PRIMARY KEY or a > UNIQUE index, the old record is deleted before the new record is > inserted. (...) > REPLACE is a MySQL extension to the SQL standard. >
O to mi chodziło. Nie dość że działa, to jeszcze jest przyzwoicie wydajne. Dzięki :)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|