Strona 1 z 1

Wsadzanie danych do tablicy MYSQL z ON DUPLICATE KEY update

Napisane: wtorek, 4 grudnia 2012, 13:36
przez sp9auv
Po licznych zapytaniach na forach i moich testach
i próbach nad zagadnieniem wsadzania nowych danych
do tablicy MYSQL (insert) wraz z update istniejących
rekordów przy pomocy jednego wywołania doszedłem do
następującego wzorca i konkluzji .
Proponuje zastosowanie składni :

1- sekcja INSERT INTO QSOS_AWARDS ( CALL , QSO_DATE , TIME_ON
, BAND , SUM_STRING )
2- sekcja SELECT T_CALL , T_QSO_DATE , T_ TIME_ON , T_BAND ,
T_SUM_STRING from T_QSOS_AWARDS
3-cia sekcja ON DULICATE UPDATE CALL= T_CALL ,
QSO_DATE = T_QSO_DATE ,
TIME_ON = T_ TIME_ON ,
BAND = T_BAND ,
SUM_STRING = T_SUM_STRING

Uwagi dodatkowe :
1. Wszystkie pola są typu string u mnie - chociaż nie jest to wymagane
2. Ilość pól we wszystkich sekcjach musi być identyczna - inaczej
MYSQL zgłasza że Count fields in not this same .
3. Jedno pole SUM_STRING u musi być kluczem typu PRIMARY -
ale nie może to być pole AUTO_INCREMENT .
Nie wystarcza by było to pole typu UNIQUE .
U mnie było to pole które było po prostu sumą stringową pól CALL ,
QSO_DATE , TIME_ON , BAND
co zapewniało że to pole było unikalne i nie tworzyły się
duplikaty .
4 . Pole T_SUM_STRING powinno być co najmniej typu UNIQUE .
Nie robiłem prób z polem typu PRIMARY ale sądzę że też
by to zadziałało .
5. W 3-ciej sekcji proszę zwrócić uwage na składnię. Wiele postów
zaleca tutaj zastosowanie składni CALL= VALUES(T_CALL) lub
CALL= VALUES(T_QSOS_AWARDS.T_CALL) .
Nie jest to niestety poprawne - gdyż zawsze w tym
przypadku otrzymywałem komunikat - Column T_CALL lub
T_QSOS_AWARDS.T_CALL not found .
Z praktyki mojej wynika że słowo VALUS () można tylko wykorzystwać
jeśli w środku podamy konkretne wartości np VALUES(1,'ab' , 3)
lub VALUES ( SUM_STRING + 'ab') - ale pola te mogą pochodzić tylko z
1-szej sekcji .
6. U mnie tablica T_QSOS_AWARDS to była tablica TEMPORARY , a więc
przechowywana w pamięci ( co znacznie przyspieszyło) i
stworzona poleceniem :
CREATE TEMPORARY TABLE if not exists T_QSOS_AWARDS ( T_CALL ,
T_QSO_DATE , T_ TIME_ON , T_BAND , T_SUM_STRING)
Oczywiscie w liście pól były jeszcze podane typy pól zgodnie
ze składnią MYSQL .
7. Dla tablicy T_QSOS_AWARDS był stworzony dodatkowo index typu
UNIQUE poleceniem
ADOCommCreaInsert.CommandText :='CREATE UNIQUE INDEX '
+ 'IDX_T_SUM_STRING'
+ ' ON TEMP_QSOS_AWARDS
('T_SUM_STRING' )';
ADOCommCreaInsert.Execute;
8 . Tablica QSOS_AWARDS może zawierać jeszcze inne pola -
ale wyżej musimy podać tylko te pola które insertujemy
lub podajemy upadate . Ta liczba tych pól musi być
ta sama .
9 . Można zastosować jeszcze pole Identyfikator np ID_QSO indeksowane -
który można ustawić na AUTO_INCREMENT .
Takiemu polu nigdy nie nadajemy wartości .
Pozdrawiam Wszystkich - SP9AUV