• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL - duplikowanie rekordów

Object Storage Arubacloud
+1 głos
846 wizyt
pytanie zadane 20 listopada 2020 w SQL, bazy danych przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
edycja 25 listopada 2020 przez Poczatkujaca s z.o.o
Witam, mam taki problem kiedy dodaje rekordy do bazy dodają się one podwójnie dlaczego?

 

Edditt

 

Niezależnie czy dodaje przez formularz PHP czy PhPmy admin

dublują się rekordy

Tzn ID jest różne ale reszta zdublowana poza ID

3 odpowiedzi

+1 głos
odpowiedź 25 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
Z czego może wynikać dubowanie się rekordów w bazie i jak sobie z nim radzić ?

Może być za pomocą formularza w php
komentarz 25 listopada 2020 przez VBService Ekspert (253,340 p.)
edycja 25 listopada 2020 przez VBService

Ten sposób z poziomu "silnika" bazy danych pilnuje, aby wpisy dla danej kolumny się nie dublowały. Jeżeli możesz usuń tą tabelę. Stwórz ponownie za pomocą tego np. kodu

CREATE TABLE `twoja_nazwa` ( 
   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   `nazwa` TEXT CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE (`nazwa`)
) ENGINE = InnoDB;

u Mnie działa (UNIQUE  - "pilnuje" przed dublowaniem wpisów) wink

INSERT INTO `twoja_nazwa`(`id`, `nazwa`) VALUES (null, 'tomek');
INSERT INTO `twoja_nazwa`(`id`, `nazwa`) VALUES (null, 'robert');
INSERT INTO `twoja_nazwa`(`id`, `nazwa`) VALUES (null, 'waldek');
INSERT INTO `twoja_nazwa`(`id`, `nazwa`) VALUES (null, 'waldek');


Tabela po wykonaniu powyższego sql-a



Jeżeli nie mamy ustawionego mechanizmu takiego jak w tym przypadku UNIQUE to np.: z poziomu kodu w php-ie robimy tak, chcemy do tabeli wprowadzić w pole nazwa wartość "waldek" to najpierw robimy SELECT-a


...

$sql = "SELECT `nazwa` FROM `twoja_nazwa` WHERE `nazwa` = 'waldek';
$result = $conn->query($sql);

jeżeli wartość "waldek" już jest w bazie zostanie zwrócona wartość

$result->num_rows > 0)

num_rows większa od zera (stąd w kodzie wiemy, że taka wartość jest), więc nie dodajemy jej ponownie, jeżeli nie ma to zwróci num_rows = 0


 . . .
 
 if ($result->num_rows > 0) {
    echo "Podana wartość jest już zapisana w bazie";
 } else { // w domyśle $result->num_rows = 0
    echo "Dodaję do bazy:";
    $sql = "INSERT INTO `twoja_nazwa`(`id`, `nazwa`) VALUES (null, 'waldek')";
    $result = $conn->query($sql);
    . . .
 }

 

komentarz 26 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
Na upldate też dziala?
komentarz 26 listopada 2020 przez VBService Ekspert (253,340 p.)

Jak widać też wink

komentarz 26 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
A dlaczego jest błąd?
komentarz 27 listopada 2020 przez VBService Ekspert (253,340 p.)
edycja 27 listopada 2020 przez VBService

Bo w MySQL "złamanie" zasady unikalności (gdy na danej kolumnie w tabeli jest ustanowione UNIQUE) jest zwracane jako błąd #1062. wtedy np.: w php zamiast pisać

...
 
$sql = "SELECT `nazwa` FROM `twoja_nazwa` WHERE `nazwa` = 'waldek';
$result = $conn->query($sql);
  
 if ($result->num_rows > 0) {
    echo "Podana wartość jest już zapisana w bazie";
 } else { // w domyśle $result->num_rows = 0
    echo "Dodaję do bazy:";
    $sql = "INSERT INTO `twoja_nazwa`(`id`, `nazwa`) VALUES (null, 'waldek')";
    $result = $conn->query($sql);
    . . .
 }

2 operacje sql (dla sprawdzenie powtórzenia - bez UNIQUE) mając "ustawiony" UNIQUE

CREATE TABLE `twoja_nazwa` ( 
   . . .
   UNIQUE (`nazwa`)
) ENGINE = InnoDB;

wykonujemy 1 operację sql, "zamykając" kod w try { . . . } catch { . . . } - PHP Exceptions


. . .

try {
  $sql = "INSERT INTO `twoja_nazwa`(`id`, `nazwa`) VALUES (null, 'waldek')";
  $result = $conn->query($sql);
  echo "Podana wartość została zapisana";
} catch (Exception $e) {
  echo "Podana wartość jest już zapisana w bazie";
}

. . .

w przykładzie powyżej zakładamy, że ewentualny błąd powstał na skutek: "złamania" zasady unikalności. Dokładne zapisanie wyjątku jest np. tu: PHP Try and Catch for SQL Insert

komentarz 27 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
A co jeśli np wpiszę imię Pawał do bazy a ja jakiś czas znów będę chciała prowadzić Pawłą ale innego da radę czy nie?
0 głosów
odpowiedź 20 listopada 2020 przez SzkolnyAdmin Szeryf (86,360 p.)
Więcej szczegółów. Czy dodajsz przez skrypt PHP odbierając wcześniej dane z formularza? Jeśli tak, to podobne rzeczy dzieją się przy odświeżeniu strony. Pomaga header("Location: tu_wstaw_adres_twojej_strony").
komentarz 20 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
Przez phpmyadmin opcje wstaw ale przez zdronę planuje później
komentarz 20 listopada 2020 przez SzkolnyAdmin Szeryf (86,360 p.)
Pokaż może strukturę tabeli i napisz więcej co robisz.
komentarz 20 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)

Tylko ID i nazwa

klikaw wstaw wpisuje nazwe bez id wstawiam 2 rekordy na są 4 zdublowane

komentarz 20 listopada 2020 przez SzkolnyAdmin Szeryf (86,360 p.)
Czy zdublowane rekordy mają taką samą wartość w polu nazwa? Czy autoinkrementacja jest w porządku (czyli zdublowane rekordy mają kolejne numery)? Pokaż jeszcze zrzut tabeli ze rekordami.
komentarz 20 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
Tak, mają kolejne nr id ale nazwa się dubluje na po usunięciu zdublowanych i próbie dodania nowych z id wpisanych recznie wyskakuje bład ale sie dodaja bez dublowania jak recznie podaje id dublują się tylko kiedy nie wpisuje id
komentarz 23 listopada 2020 przez Poczatkujaca s z.o.o Obywatel (1,860 p.)
Nie pomogło. Nie wiem, może robie coś źle ale rekordy się duklikują zarówno z poziomu PHP jak i MySQLa.
komentarz 25 listopada 2020 przez Wiciorny Ekspert (270,110 p.)

@VBService, twoje zapytanie SQL JEST złe.. . w ten sposób UNIQUE nie zostanie dodany... 
w mysql przy dodaniu do instniejąćej tabeli wypadało by dodać nazwe 
 

ALTER TABLE `nazwa_tabeli`
ADD CONSTRAINT nazwa_warunku_unikalności
UNIQUE (`nazwa_kolumny1`,`nazwa_kolumny2`)

 

0 głosów
odpowiedź 25 listopada 2020 przez Wiciorny Ekspert (270,110 p.)
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

można to też tak obejść, albo nałożyć unikat z alter table jak kolega na dole napisał, bardzo niepraktyczne zastosowania. 
Wyobraź sobie sytuacje kiedy nie ustawiono, klucza głównego- wtedy, przed każdym insertem wypadałoby zrobić jego równoważny DELETE, co daje nam 2*n operacji- gdzie n było by liczbą zapytań insertujących np

Efekty nie są identyczne dla tabeli InnoDB, w której a jest kolumną z automatyczną inkrementacją. W przypadku kolumny z automatycznym zwiększaniem, instrukcja INSERT zwiększa wartość autoinkrementacji, ale UPDATE nie).

Podobne pytania

0 głosów
1 odpowiedź 370 wizyt
0 głosów
1 odpowiedź 765 wizyt
pytanie zadane 22 marca 2022 w SQL, bazy danych przez Marcin Lorek Początkujący (260 p.)
0 głosów
0 odpowiedzi 96 wizyt
pytanie zadane 1 listopada 2020 w SQL, bazy danych przez blowing_rocket Nowicjusz (170 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...