Πώς να 'εισαγάγετε εάν δεν υπάρχει' στη MySQL;

Ξεκίνησα ψάχνοντας στο google και βρήκα αυτό το άρθρο που μιλάει για τους πίνακες mutex.

Έχω έναν πίνακα με ~14 εκατομμύρια εγγραφές. Αν θέλω να προσθέσω περισσότερα δεδομένα στην ίδια μορφή, υπάρχει τρόπος να διασφαλίσω ότι η εγγραφή που θέλω να εισαγάγω δεν υπάρχει ήδη χωρίς να χρησιμοποιήσω ένα ζεύγος ερωτημάτων (δηλαδή, ένα ερώτημα για να ελέγξω και ένα για να εισαγάγω είναι το σύνολο αποτελεσμάτων κενό);

Ένας περιορισμός "μοναδικό" σε ένα πεδίο εγγυάται ότι η εισαγωγή θα αποτύχει αν υπάρχει ήδη;

Φαίνεται ότι με μόνο έναν περιορισμό, όταν εκδίδω την εισαγωγή μέσω php, το σενάριο καταρρέει.

Λύση

χρησιμοποιήστε INSERT IGNORE INTO table

βλέπε

Σχόλια (16)

on duplicate key update, ή insert ignore μπορεί να είναι βιώσιμες λύσεις με τη MySQL.


Παράδειγμα ενημέρωσης on duplicate key update με βάση το mysql.com

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

Παράδειγμα insert ignore με βάση το mysql.com

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

Ή:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

Or:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]
Σχόλια (0)

Οποιοσδήποτε απλός περιορισμός θα πρέπει να κάνει τη δουλειά, αν μια εξαίρεση είναι αποδεκτή. Παραδείγματα :

  • πρωτεύον κλειδί αν δεν είναι υποκατάστατο
  • μοναδικός περιορισμός σε μια στήλη
  • Μοναδικός περιορισμός πολλαπλών στηλών

Λυπάμαι που αυτό φαίνεται απατηλά απλό. Ξέρω ότι φαίνεται άσχημο σε σχέση με τον σύνδεσμο που μοιράζεστε μαζί μας. ;-(

Αλλά παρ' όλα αυτά δίνω αυτή την απάντηση, επειδή φαίνεται να καλύπτει την ανάγκη σας. (Αν όχι, μπορεί να προκαλέσει την επικαιροποίηση των απαιτήσεών σας, η οποία θα ήταν "ένα καλό πράγμα"(TM) επίσης).

Επεξεργασία: Εάν μια εισαγωγή θα έσπαγε τον μοναδικό περιορισμό της βάσης δεδομένων, θα δημιουργηθεί μια εξαίρεση σε επίπεδο βάσης δεδομένων, η οποία θα μεταδοθεί από τον οδηγό. Σίγουρα θα σταματήσει το σενάριό σας, με μια αποτυχία. Θα πρέπει να είναι δυνατόν στην PHP να αντιμετωπιστεί αυτή η περίπτωση ...

Σχόλια (4)