2016-04-05 27 views
0

ben buMySQL Tetik yinelenen veri

CREATE TRIGGER `tambah_riwayatobat` AFTER INSERT ON `obat` 
FOR EACH ROW insert into riwayat_obat(nama, keterangan, distributor,tanggal) 
(select new.nama, 'Masuk', d.nama ,now() 
From distributor d 
join obat ON new.id_distributor = d.id_distributor) 
i tetikleyici ile veri eklemeye çalıştığınızda

ve ben kısıtlaması, getirme bölüm verilerinin biri gibi sorgu vardı, ama neden veri yinelenen girişi olacak?

Çıktı:

enter image description here

örnek i veri obat 1 saat eklemek için çalışırsanız, tambah_riwayatobat ekleme 1 verileri çok

i 2 defa obat verileri tambah_riwayatobat veri eklemeye çalışırsanız

i veri obat 3 saat eklemek çalışırsanız aynı veriler

ile 2 kez yerleştirin aynı verilerle tambah_riwayatobat uç üzerindeki veriler 3 kez

+0

(1) Tüm tetikleyicileriniz başka bir tabloya yerleştirilir. Hiçbir ekleme yapmaz. (2) Çiftleri önlemek istiyorsanız, benzersiz bir kısıtlama veya dizin kullanın. –

+0

Kodumu düzeltebilir misin? –

cevap

0

Emin değilim tam olarak neler oluyor, ancak tetikleme kodunuzdaki birleştirmenin bir sonucudur. Sen distributor için obat katılıyorsun ama senin durum ikinci ve sonraki INSERT senin SELECT alt sorgu birden fazla satırı seçerek nerede böylece çapraz ürünün çeşit alıyoruz obat bahsedilmemektedir katılmak.

Güvenmemelisin (ve gerekmez) Eğer obat gereken tüm veriler pseudorecord NEW zaten olduğundan, katılmak kullanın.

CREATE TRIGGER `tambah_riwayatobat` 
    AFTER INSERT ON `obat` 
    FOR EACH ROW 
    INSERT INTO riwayat_obat 
     (nama, keterangan, distributor, tanggal) 
     (SELECT NEW.nama, 'Masuk', d.nama, now() 
     FROM distributor d 
     WHERE new.id_distributor = d.id_distributor 
     LIMIT 1); 

LIMIT fıkra SELECT yalnızca bir satır seçer sağlayacaktır, bu yüzden INSERT ekler sadece bir satır;: Aşağıdaki kod çok daha iyi çalışması gerekir distributor.id_distributor birincil anahtar ise, LIMIT yan tümcesi gereksizdir.