SQL muss ohne Duplikate eingefügt werden

  • Die Tabelle ist derzeit so:

     CREATE TABLE `feed_items` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `feed_id` int(11) NOT NULL,
      `remote_id` varchar(32) NOT NULL DEFAULT '',
      `title` varchar(255) NOT NULL DEFAULT '',
      `link` varchar(255) NOT NULL DEFAULT '',
      `updated_time` datetime NOT NULL,
      `created_time` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     

    Ich muss einen Weg finden Wenn ich also mehrere RSS-Feeds in eine Tabelle ziehe und Artikel mit demselben Titel den gleichen Wert wie 'remote_id' haben, wie kann ich sicherstellen, dass kein doppelter Wert eingefügt wird?

    Ich verwende derzeit

     $this->db->query('INSERT INTO feed_items(feed_id, remote_id, link, title, created_time, updated_time) VALUES (?, ?, ?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE remote_id=remote_id', array($this->feed_id, $this->remote_id, $this->link, $this->title, $this->created_time, $this->remote_id));
     

    Ich habe mich gefragt, ob es einen besseren Weg gibt?

    22 November 2011
    Sorpigal
5 answers
  • Fügen Sie diesen beiden Spalten eine UNIQUE -Einschränkung hinzu.

    22 November 2011
    alex
  •  ALTER TABLE `feed_items` ADD UNIQUE INDEX `constraint` (`link`, `remote_id`);
     
    22 November 2011
    Michael Leaney
  • Sie können ON DUPLICATE verwenden, um solche Bedingungen zu vermeiden: Prüfen Sie: = "nofollow"> http://dev.mysql.com/doc/refman/5.0/de/insert-on-duplicate.html

    Hoffe, es hilft

    22 November 2011
    Sudhir Bastakoti
  • Probieren Sie Folgendes aus:

     $this->db->query('INSERT INTO feed_items(feed_id, remote_id, link, title, created_time, updated_time) SELECT ?, ?, ?, ?, ?, NOW() WHERE not exists(SELECT 1 FROM feed_items f2 WHERE f2.title = ? and f2.remote_id = ?)', array($this->feed_id, $this->remote_id, $this->link, $this->title, $this->created_time, $this->title, $this->remote_id));
     

    Nur zur Klarstellung - diese Lösung ändert den Einsatz in .. .werte-Anweisung für eine Einfügung in ... select-Anweisung mit einer nicht vorhandenen () - Klausel. Wenn diese Klausel nicht vorhanden ist, wird die Einfügung verhindert, wenn ein Datensatz gefunden wird, der mit einem bereits vorhandenen übereinstimmt. Es wird kein Fehler ausgegeben, wenn bereits ein Datensatz vorhanden ist.

    22 November 2011
    Jake Feasel
  • Vielen Dank für die Antworten!

    Ich habe es tatsächlich einige Stunden nach der Veröffentlichung dieses Problems gelöst. Ich habe die remote_id zu einer eindeutigen Spalte gemacht und dann die folgenden Schritte ausgeführt die SQL

     INSERT INTO feed_items(feed_id, remote_id, link, title, created_time, updated_time) VALUES (?, ?, ?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE remote_id=remote_id
     
    23 November 2011
    viperfx