Doppelte Einträge

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

Doppelte Einträge

Postby msp » 20. January 2016 14:27

Hey
ich habe mir gerade XAMPP mit PHP 7.0.1 Unterstützung heruntergeladen und teste das jetzt etwas.
Ich habe in MariaDB eine Tabelle erstellt mit
id: INT UNSIGNED PRIMARY AI
name: VARCHAR 255 utf8_general_ci UNIQUE

wenn ich einen einfachen Befehl verwende wie
SELECT * FROM table
Erhalte ich einige Einträge Doppelt. Dabei stimmen die ID und auch der inhalt im Feld Name exakt überein. Wie kann ich das verhindern?

Liebe Grüße
msp
 
Posts: 4
Joined: 20. January 2016 14:19
Operating System: Windows

Re: Doppelte Einträge

Postby Altrea » 20. January 2016 18:23

Hi,

Das Eintragen doppelter IDs ist bei einem Unique key (wie der Primary Key einer ist) nicht möglich.

Daher liefere uns erstmal ein vollständiges Code Beispiel inklusive SQL Anweisungen zum herstellen der Datenbank im jetzigen Zustand.

Irgendetwas hast du uns noch nicht erzählt um dieses Phänomen zu erklären.

Mit freundlichen Grüßen,
Altrea
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8298
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: Doppelte Einträge

Postby Nobbie » 20. January 2016 19:44

Altrea wrote:Das Eintragen doppelter IDs ist bei einem Unique key (wie der Primary Key einer ist) nicht möglich.


Das habe ich auch immer gedacht, muss aber eingestehen, dass ich auch ein Problem mit einem SMF Forum habe, da ist es der Software auch "irgendwie" gelungen, einen doppelten Primärschlüssel anzulegen. Wenn ich ein Backup davon ziehe und es lokal einspielen will, bekomme ich immer die Meldung "Duplicate Key". Ist mir auch ein absolutes Rätsel, wie das möglich ist, aber ich kann es jederzeit reproduzieren und vorführen.
Nobbie
 
Posts: 8779
Joined: 09. March 2008 13:04

Re: Doppelte Einträge

Postby msp » 20. January 2016 22:58

Aus der export Datei habe ich folgendes kopiert
Code: Select all
CREATE TABLE `question` (
  `id` int(10) UNSIGNED NOT NULL,
  `content` varchar(255) CHARACTER SET utf8 NOT NULL,
  `quality` tinyint(4) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `question`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `content` (`content`);

ALTER TABLE `question`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=853

Der Quellcode ist auch denkbar einfach gehalten.

Code: Select all
$_db = new mysqli('localhost','root','','m_quest');
$_db->set_charset('utf8');
header('Content-Type: text/html; charset=utf-8');

$res = $_db->query("SELECT * FROM question");
while($row = $res->fetch_object()){
   echo "<a href='showQuestion.php?id={$row->id}'>{$row->content}</a><br>";
}

Der Eintrag stimmt sowohl in id als auch in content exakt überein. in PHPmyAdmin konnte ich (bisher) keine doppelten vorfinden.
Gerade deswegen kann ich mir das nicht erklären.
Ich habe lange Zeit gar nichts mehr mit PHP/MySQL gemacht aber ich war es auch vorher gewohnt dass die Ergebnisse wenn keine Sortierung angegeben war meist in der Reihenfolge ausgegeben werden wie sie in der Datenbank vorliegen. Das ist jetzt auch nicht mehr der Fall. Aber das lässt sich ja vermeiden.
msp
 
Posts: 4
Joined: 20. January 2016 14:19
Operating System: Windows

Re: Doppelte Einträge

Postby Altrea » 21. January 2016 01:12

Das ist ja interessant...
Ich bin mir wohl bewusst, dass es Einstellungen gibt constraints (i.d.R. temporär) zu deaktivieren (beschrieben zum Beispiel hier: https://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-bulk-data-loading.html), doch das sollte bei Primärschlüsseln eigentlich nicht funktionieren... zumindest nicht mit der InnoDB Engine. Es kann durchaus sein, dass sich MyISAM hier weniger streng verhält...
Wieder was gelernt.

@msp:
Der gezeigte Code enthält keine Rückschlüsse auf das erwähnte Verhalten, daher liegt die Vermutung nahe, dass die Daten in der Datenbank das Problem sind.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8298
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: Doppelte Einträge

Postby Nobbie » 21. January 2016 11:48

Altrea wrote:Das ist ja interessant...


Wobei ich auch zugeben muss, dass das SMF Forum (wie so viele freie Software) grauenhaft programmiert ist. Der kritische Primärschlüssel verstößt gegen jedes Datenbankprinzip, das ist nicht (wie es sein MUSS), einfach nur ein bedeutungsloser Integer Wert, sondern besteht aus zwei Teilfeldern, die auch noch beide eine semantische Funktion haben. Also nichts von wegen "the key is the key and nothing but the key", sondern das diametrale Gegenteil. Und so wie es aussieht, ist da über einen Type-Mismatch (konkret der String '003' entspricht dem Integer 3) der Duplikate Key reingerutscht. Das ist ein ganz furchtbares Datendesign (eigentlich ist es gar kein Design, sondern Müll - und das ist das SMF Forum, mit eine der verbreitetsten Scripts).

Nur wundert es mich dennoch, dass man den Wert anlegen konnte, denn wenn ich ein Backup ziehe (in eine *.sql Datei) und die zu Hause einspiele, dann kriege ich beim zweiten INSERT den Duplikate Key - wieso ist der nicht zur Laufzeit aufgetreten?? Ich muss dann immer mit einem Editor reingehen und den einen Satz aus der Datei löschen. Danach geht es wieder.
Nobbie
 
Posts: 8779
Joined: 09. March 2008 13:04

Re: Doppelte Einträge

Postby Nobbie » 21. January 2016 11:59

P.S.: Jetzt, wo ich das nochmal erläutert habe, kommt mir eine Idee. Das ist im SMF Forum ja ein ganz schrecklicher Primärschlüssel und da werden Strings mit Integers gemischt. Vielleicht ist das ja ein Reihenfolgeproblem, je nachdem, welcher Satz zuerst angelegt wird, ist das ein Duplicate Key oder nicht, denn möglicherweise wird in Abhängigkeit des vorhandenen Datensatzes ein anderes Casting betrieben. Möglicherweise schon im SMF Script auf PHP Ebene, möglicherweise auch in der Engine (ich weiß nicht auswendig, ob das mit InnoDB oder MyISAM läuft). Vielleicht läuft es Online auch mit MyISAM und bei mir lokal mit InnoDB, auch das könnte das Verhalten erklären.

Aber es liegt definitiv an dem schrecklichen Primärschlüssel, ich kann nicht begreifen, wie man so einen Müll programmieren kann.
Nobbie
 
Posts: 8779
Joined: 09. March 2008 13:04


Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 1 guest