SQL εφαρμογή του MySQL Server 2005 ΑΝΤΙΚΑΤΑΣΤΑΣΗ ΣΤΟ;

ψήφοι
73

MySQL έχει αυτόν τον εξαιρετικά χρήσιμο ακόμα κατάλληλα διαμορφωμένα REPLACE INTOεντολών SQL.

Μπορεί αυτό εύκολα παράδειγμα προς μίμηση στον SQL Server 2005;

Ξεκινώντας μια νέα συναλλαγή, να κάνει ένα Select()και στη συνέχεια είτε UPDATEείτε INSERT IGNORE και COMMITείναι πάντα ένα μικρό κομμάτι από ένα πόνο, ειδικά όταν το κάνουν στην εφαρμογή και ως εκ τούτου, διατηρώντας πάντα 2 εκδόσεις της δήλωσης.

Αναρωτιέμαι αν υπάρχει ένας εύκολος και καθολική τρόπος για να εφαρμόσει μια τέτοια λειτουργία σε SQL Server 2005;

Δημοσιεύθηκε 01/08/2008 στις 23:13
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
53

Αυτό είναι κάτι που με ενοχλεί για MSSQL ( παραλήρημα στο blog μου ). Εύχομαι MSSQL υποστηρίζονται upsert.

Κωδικός @ Dillie-O είναι ένας καλός τρόπος σε παλαιότερες εκδόσεις του SQL (+1 ψήφος), αλλά εξακολουθεί να είναι βασικά δύο λειτουργίες IO (η existsκαι στη συνέχεια το updateή insert)

Υπάρχει μια ελαφρώς καλύτερος τρόπος για αυτό το post , κυρίως:

--try an update
update tablename 
set field1 = 'new value',
    field2 = 'different value',
    ...
where idfield = 7

--insert if failed
if @@rowcount = 0 and @@error = 0
    insert into tablename 
           ( idfield, field1, field2, ... )
    values ( 7, 'value one', 'another value', ... )

Αυτό μειώνει σε μία πράξεις IO αν είναι μια ενημερωμένη έκδοση, ή δύο αν ένα ένθετο.

MS SQL2008 εισάγει mergeαπό το SQL: 2003 πρότυπο:

merge tablename as target
using (values ('new value', 'different value'))
    as source (field1, field2)
    on target.idfield = 7
when matched then
    update
    set field1 = source.field1,
        field2 = source.field2,
        ...
when not matched then
    insert ( idfield, field1, field2, ... )
    values ( 7,  source.field1, source.field2, ... )

Τώρα είναι πραγματικά ακριβώς μια εργασία IO, αλλά απαίσιο κώδικα :-(

Απαντήθηκε 15/08/2008 στις 13:50
πηγή χρήστη

ψήφοι
20

Η λειτουργικότητα που ψάχνετε είναι παραδοσιακά ονομάζεται UPSERT. Atleast να γνωρίζει τι λέγεται μπορεί να σας βοηθήσει να βρείτε αυτό που ψάχνετε.

Δεν νομίζω SQL Server 2005 έχει κάποια μεγάλη τρόπους για να γίνει αυτό. 2008 εισάγει τη δήλωση MERGE που μπορεί να χρησιμοποιηθεί για να επιτευχθεί αυτό, όπως φαίνεται στο: http://www.databasejournal.com/features/mssql/article.php/3739131 ή http://blogs.conchango.com/davidportas/archive/ 2007/11 / 14 / SQL-διακομιστή 2008-MERGE.aspx

Συγχώνευση ήταν διαθέσιμα στην beta του 2005, αλλά αυτό αφαιρείται από το τελικό δελτίο.

Απαντήθηκε 01/08/2008 στις 23:22
πηγή χρήστη

ψήφοι
15

Ποια η upsert / συγχώνευση κάνει είναι κάτι με την έννοια της ...

IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
   UPDATE [Table] SET...
ELSE
   INSERT IGNORE  INTO [Table]

Έτσι, ελπίζουμε ότι ο συνδυασμός των άρθρων αυτών και ο κωδικός αυτός ψευδο να προχωρήσουν τα πράγματα.

Απαντήθηκε 01/08/2008 στις 23:31
πηγή χρήστη

ψήφοι
9

Έγραψα ένα blog post σχετικά με αυτό το θέμα .

Η ουσία είναι ότι αν θέλετε φθηνά ενημερώσεις ... και θέλετε να είναι ασφαλές για ταυτόχρονη χρήση. προσπαθήστε:

update t
set hitCount = hitCount + 1
where pk = @id

if @@rowcount < 1 
begin 
   begin tran
      update t with (serializable)
      set hitCount = hitCount + 1
      where pk = @id
      if @@rowcount = 0
      begin
         insert t (pk, hitCount)
         values (@id,1)
      end
   commit tran
end

Με αυτό τον τρόπο έχετε την 1η λειτουργίας για ενημερώσεις και ένα μέγιστο των 3 επιχειρήσεις για ένθετα. Έτσι, εάν είστε γενικά την ενημέρωση αυτή είναι μια ασφαλής φθηνή επιλογή.

Θα ήθελα, επίσης, να είναι πολύ προσεκτικοί για να μην χρησιμοποιήσετε τίποτα που δεν είναι ασφαλές για ταυτόχρονη χρήση. Πραγματικά εύκολο να πάρει πρωτεύον κλειδί παραβιάσεις ή διπλές γραμμές παραγωγής.

Απαντήθηκε 21/09/2008 στις 23:05
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more