logo elektroda
logo elektroda
X
logo elektroda
ADVERTISEMENT
ADVERTISEMENT
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[SQL] Jak w SQL wstawiać dane tylko, gdy nie istnieją identyczne wiersze?

MENETHOR 28 Nov 2004 21:21 2405 9
ADVERTISEMENT
  • #1 1020809
    MENETHOR
    Level 10  
    Posts: 52
    w jaki sposób opisać wstawianie danych "sql'el" do bazy, ale tak zeby dane wstawiane były sprawdzane z danymi juz istniejacymi
    (chodzi o wiersze) i jesli wiersz z identycznymi danymi istnieje - now dany by nie były dopisywane
    Zamykam. - arnoldziq
  • ADVERTISEMENT
  • #2 1022930
    imarko
    Level 11  
    Posts: 11
    myślę że chodzi ci o zachowanie inegralności danych, w sql-u słuzy do tego funkcja primary key - czyli ustala sie w tabeli kolumnę lub kolumny jednoznacznie identyfikujące wiersze np.

    tworzysz tabelę pracownicy

    create table PRACOWNICY(

    IMIE VARCHAR(20) NOT NULL,
    NAZWISKO VARCHAR(20) NOT NULL,

    PRIMARY KEY (NAZWISKO));

    oczywiscie klucz może zawierać wiecej pozycji...
  • ADVERTISEMENT
  • #3 1022934
    imarko
    Level 11  
    Posts: 11
    a tak wogule to dobrą książką dla początkujących jest SQL w InterBase dla WIndows i Linuksa Arkadiusza Jakubowskiego
  • #4 1033436
    MiL999
    Level 26  
    Posts: 1173
    Help: 59
    Rate: 74
    Mozna to zrobic bardziej elegancko:
    Trzeba wykorzystac funkcje IF EXISTS.
    Np.
    IF EXISTS (SELECT cos tam... )
    INSERT INTO ......

    Wtedy nie zostanie wstawiony nowy wiersz jezeli juz taki istnieje. Nie wyskoszy tez komunikat o naruszeniu klucza.
  • #5 1040124
    MisiekD
    Level 15  
    Posts: 142
    Help: 2
    Rate: 3
    Quote:
    Mozna to zrobic bardziej elegancko:
    Trzeba wykorzystac funkcje IF EXISTS.
    Np.
    IF EXISTS (SELECT cos tam... )
    INSERT INTO ......


    i przy 50000 rekordów (co wcale nie jest dużo) twoi klijęci będzią bardzo zadowoleni z szybkości działania programu :-P.
    Jeśli pole, w którym mają się nie powtarzać wartości nie jest kluczem głównym (ważne, aby tylko to pole było kluczem, a nie kilka pól) to zakładasz na nim unikalny index. Potem jak spróbujesz dodać do bazy rekord, gdzie wartość w danym polu już istnieje to dostaniesz wyjątek, który trzeba obsłużyć i po kłopocie.
  • ADVERTISEMENT
  • #6 1040448
    MiL999
    Level 26  
    Posts: 1173
    Help: 59
    Rate: 74
    W poscie nie jest napisane ile w tabeli bedzie rekordow. Jezeli to bedzie tabela slownikowa to ta metoda jest najlepsza. Jezeli maja tam byc tysiace rekordow to trzeba odpowiednio zaprojektowac ta tabele (niepowtarzalne ID).
  • ADVERTISEMENT
  • #7 1040560
    MisiekD
    Level 15  
    Posts: 142
    Help: 2
    Rate: 3
    a czy mógłbyś mi wytłumaczyć w czym jest ona taka najlepsza? I o co Ci chodziło z tymi ID?
  • #8 1045037
    MiL999
    Level 26  
    Posts: 1173
    Help: 59
    Rate: 74
    Ta metoda wcale nie jest tak wolna jak piszesz. W firmie sprawdzilem to na tabeli z ponad 200000 rekordow. Poza tym zapisywanie danych do tabeli wykonuje sie duzo rzadziej niz pobieranie wiec szybkosc tej operacji nie jest decydujaca.
    Oczywiscie Twoja metoda tez jest dobra ale wymaga oprogramowania wyjątków. Wszystko zalezy do czego i gdzie to ma byc wykorzystane.
  • #9 1045551
    MisiekD
    Level 15  
    Posts: 142
    Help: 2
    Rate: 3
    rozwiązanie z IF EXISTS wg mnie ma jeszcze dwie wady
    1. najważniejsza - jeśli dany rekord już istnieje to aktualnie dodawany nie zostanie dodany, a user nie wie, czy rekord został dodany, czy nie
    2. generowanie niepotrzebnego ruchu w sieci - najpierw trzeba zrobić SELECT a dopiero potem INSERT - tu rozwiązaniem jest procedura wbudowana, która w zależności czy rekord jest czy nie dodawała by albo nie :-) i info czy dodała czy nie zwracała do aplikacji
  • #10 1045669
    MiL999
    Level 26  
    Posts: 1173
    Help: 59
    Rate: 74
    Uzycie IF EXISTS nie spowoduje wzrostu ruchu w sieci bo podzapytanie nie wychodzi poza serwer. To po prostu warunek sprawdzany na serwerze i w zaleznosci od niego wykonywane jest wstawienie nowego rekordu.

    Wszystko zalezy od tego do czego chcemy tego uzyc. Ja pracuje przy tworzeniu systemu rozproszonego, gdzie dostep do bazy danych odbywa sie rowniez przez urządzenia mobilne i taka metoda jest tu niezbedna.

    Mam propozycje zeby autor pytania napisal do czego ta baza ma sluzyc i wtedy na pewno znajdziemy jakies rozsadnie rozwiązanie :)

Topic summary

✨ Dyskusja dotyczy sposobów wstawiania danych do bazy SQL tylko wtedy, gdy nie istnieją identyczne wiersze. Podstawowym rozwiązaniem jest zastosowanie klucza głównego (PRIMARY KEY) lub unikalnego indeksu na kolumnach jednoznacznie identyfikujących rekordy, co zapobiega duplikatom. Alternatywnie można użyć konstrukcji IF EXISTS, która sprawdza istnienie rekordu przed wstawieniem nowego, choć wiąże się to z dodatkowymi zapytaniami SELECT i potencjalnym brakiem informacji zwrotnej dla użytkownika, czy rekord został dodany. Wskazano również, że implementacja takiej logiki w procedurach składowanych może zoptymalizować operacje i zmniejszyć ruch sieciowy. Dyskusja podkreśla znaczenie odpowiedniego projektowania tabel, zwłaszcza przy dużej liczbie rekordów, oraz konieczność dostosowania rozwiązania do konkretnego zastosowania, np. systemów rozproszonych czy urządzeń mobilnych. Wspomniano także o obsłudze wyjątków przy próbie dodania duplikatu oraz o wpływie na wydajność operacji wstawiania danych.
Generated by the language model.
ADVERTISEMENT