Eğer "IF" ile bir mysql açıklama başlayabilir?

3 Cevap php

Ben mysql "rekor varsa o zaman GÜNCELLEMEYİ ELSE INSERT" uygulamak çalışıyorum. Özellikle, ben Doctrine ORM ile bunu nasıl anlamaya var.

Yerli MySql kullanarak bir çözüm "YİNELENEN KEY UPDATE" kullanmaktır. Bu ne yazık ki Doktrini desteklenmez.

Başka yarı çözüm sözdizimi "REPLACE INTO" kullanmaktır. Doktrin, bu destekler, ancak DEĞİŞTİR kayıtları GÜNCELLEMEYİ değil, bunun yerine kayıt düşer ve Bu nedenle (yeni bir otomatik artış kimliği ile.) Yeni bir tane oluşturur, benim yaptığım gibi otomatik artış kimlikleri bağlıdır eğer kötü bir çözüm .

Ben ameliyat çalışıyorum tablo INNODB, yani işlemler içine baktım, ama bunların dışında uygulamak gibi aynı kurallar işlemler içinde geçerli eğer ben tam anlamıyorum.

Ben bir hareket içinde "(INSERT INTO tablo GÖRMEZDEN critical_id = $ id) IF THEN (UPDATE tablo SET field = 'NEW_VALUE') ELSE çıkmak" diyebilir miyiz?

Ben böyle bir şey diyemeyiz, bu soruna herhangi bir çözüm var mı?

3 Cevap

Öncelikle var olan satırları bulmak için SELECT sonra GÜNCELLEMEYİ veya gerekli INSERT: iş "YİNELENEN KEY UPDATE ON" yapmak, ya da iki tablo kullanarak geçiş için bir yol bulmak ya.

Yani, hemen hemen sizin için yukarıdaki iş yapan bir saklı yordam bina kısa tek seçenek bulunuyor.

"Ekle veya güncelleştirme" "Upsert" denir. Eğer "Upsert mysql" google Eğer sadece birkaç çözümler olduğunu göreceksiniz.

  1. 2-step, Ekle, ardından Update ve varyasyonları
  2. "ON KEY UPDATE DUPLICATE"
  3. DEĞİŞTİR

Ve belki daha az, ancak bu çoğu varyasyonları vardır.

Işlemleriniz SQL kullanarak bu gibi görünecektir:

    UPDATE xxx SET (x1, x2) = (y1, y2) WHERE id = myid;
    IF found THEN
        RETURN;
    END IF;
    BEGIN
        INSERT INTO xxx (x1, x2) VALUES (y1, y2);
        RETURN;
    EXCEPTION WHEN unique_violation THEN
    --##Do nothing, or you can put this whole sql code
    --##in a LOOP and it will loop over and try update again
    END;

Bu kod, benim postgresql işlevlerinden biri kaldırılır. Ben InnoDB bu desteklemiyor düşünüyorum, ama yanlış olabilir.

Zaten INSERT INTO GÖRMEZDEN belirtmiştik. Bu ihtiyaçlarınızı karşılamak değil mi?

http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html