Duplikowanie przy Insert Into

Duplikowanie przy Insert Into
PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

Mam pytanie - czy istnieje w MySQL mozliwosc sprawdzenia czy wstawiane rekordy nie sa duplikatem ?
Tzn. chce za pomoca Insert Into wstawic rekord z danymi np "Jan Kowalski Gdynia" - czy jest jakies polecenie ktore sprawdza czy nie ma juz identycznego i wtedy po prostu nic nie wstawia ? (tak jak np przy tworzeniu bazy mamy CREATE DATABASE IF NOT EXISTS)

axelbest
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2255
0

REPLACE INTO table (id, data) VALUES (1, 'tekst');

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.

mariano901229
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 597
0

Wykorzystaj wyzwalacz/trigger na tabeli.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

to proszę cię napisz tu łaskawie jak proponujesz to zrobić triggerem. Bo chyba nie sugerujesz, żeby w triggerze robić delete from tabela where (wszystkie pola) = (wstawiane pola) - przecież dokłądnie to robi REPLACE INTO

mariano901229
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 597
0
abrakadaber napisał(a):

to proszę cię napisz tu łaskawie jak proponujesz to zrobić triggerem. Bo chyba nie sugerujesz, żeby w triggerze robić delete from tabela where (wszystkie pola) = (wstawiane pola) - przecież dokłądnie to robi REPLACE INTO

Ok zdałem sobie sprawę, że w wyzwalaczach (before insert) w MySQL nie możemy używać słów kluczowych transakcji takich jak np. ROLLBACK w przeciwieństwie do MS SQL. Można natomiast sprawdzić czy istnieje wpis i wywołać wyjątek jak poniżej. Łatwiejszym było by może założenie indeksu na te kolumny, ale jeżeli z jakichś przyczyn autor wątku chce sprawdzić to może tak zrobić.

Kopiuj
begin
if exists ( select * from table where table.columnA = NEW.columnA) then
     SIGNAL sqlstate '45001' set message_text = "Duplicated data!";
end if;
end
abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

ano nie da się (btw w postgresie jest to bajerancko rozwiązane). Co do wyjątku to znowu - jest to kłopotliwe bo trzeba po stronie aplikacji obsłużyć

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

W skrocie: stworzylem plik index.php w ktorym tworze nowa baze, tabele i uzupelniam ja danymi. Jednak za kazdym odswiezeniem pliku dodaje mi na nowo te same rekordy - czego nie chce.

Z tabela i baza danych jest prosto - dzieki funkcji IF NOT EXISTS po prostu nie tworzy nowej jesli juz jest - a rekordy dodaje, bo nie widze funkcji ktora by sprawdzala czy dany wiersz juz nie istnieje.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

to błąd masz w myśleniu a nie dodawaniu duplikatów. Bazę tworzy się RAZ i RAZ uzupełnia się słowniki a nie za każdym razem jak ktoś na stronę wejdzie!!

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

w takim razie nie wiem jak mam stworzyc kod tak zeby tylko raz tworzylo baze i ja wypelnialo, a osobno wykonywalo na niej wszystkie funkcje

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
2

w wielkim skrócie index jest "uruchamiany" za każdym razem jak ktoś wejdzie na stronę lub ją odświeży więc umieszczanie w niej kodu, który tworzy bazę jest bezsensowne. Kod tworzący bazę umieszcza się tak, żeby wykonał się raz podczas instalacji serwisu. W Twoim przypadku może to być nawet osobny plik, który uruchomisz raz a potem skasujesz i tyle.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.