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)
Duplikowanie przy Insert Into
- Rejestracja: dni
- Ostatnio: dni
- Postów: 19
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
- Postów: 2255
REPLACE INTO table (id, data) VALUES (1, 'tekst');
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 597
Wykorzystaj wyzwalacz/trigger na tabeli.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 597
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ć.
begin
if exists ( select * from table where table.columnA = NEW.columnA) then
SIGNAL sqlstate '45001' set message_text = "Duplicated data!";
end if;
end
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
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ć
- Rejestracja: dni
- Ostatnio: dni
- Postów: 19
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
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!!
- Rejestracja: dni
- Ostatnio: dni
- Postów: 19
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
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.