SQLite3 NOT NULL constraint failed sorunu Python


#1

Merhabalar;
Ufak bir program yazmaya çalışıyorum ancak veri tabanında FOREIGN KEY ile PRIMARY KEY bağlantısında sorun yaşıyorum.
Kodları aşağıya ekliyorum

Özetle durum şu
3 tane tablom var

  ##urunler##          ##fiyatlar##         ##marketler## 
PK *urun_no          PK *fiyat_no         PK *market_no 
    barkod_no            fiyat                market_adi 
    urun_adi         FK  market_no            sube_adi 
FK  fiyat_no     

kaydı oluşturmak için ; barkod_no, urun_adi, market_adi, sube_adi, fiyat bilgileri giriliyor.

Bu sırada oluşan marketler tablosundaki market_no bilgisinin fiyatlar tablosundaki market_no sütununa ,
fiyatlar tablosundaki fiyat_no bilgisinin urunler tablosundaki fiyat_no sütununa otomatik olarak kaydolmasını istiyorum.

Bunun için aşağıdaki gibi bir tablo oluşumu yazdım.
*Kayıt kodları da bir aşağıda.

Bunu çalıştırıp kaydet dediğimde “sqlite3.IntegrityError: NOT NULL constraint failed: fiyatlar.market_no” hatasını alıyorum.

Nerede yanlış yaptım yardımcı olabilir misiniz?

veriler.execute("CREATE TABLE IF NOT EXISTS " 
                "marketler(market_no INTEGER PRIMARY KEY AUTOINCREMENT, " 
                "market_adi VARCHAR, " 
                "sube_adi VARCHAR)") 

veriler.execute("CREATE TABLE IF NOT EXISTS " 
                "fiyatlar(fiyat_no INTEGER PRIMARY KEY AUTOINCREMENT, " 
                "fiyat FLOA," 
                "market_no INTEGER NOT NULL , 
                 FOREIGN KEY (market_no) REFERENCES marketler(market_no))") 

veriler.execute("CREATE TABLE IF NOT EXISTS " 
                "urunler(urun_no INTEGER PRIMARY KEY AUTOINCREMENT, " 
                "barkod_no VARCHAR, " 
                "urun_adi VARCHAR," 
                "fiyat_no INTEGER NOT NULL , 
                 FOREIGN KEY (fiyat_no) REFERENCES fiyatlar(fiyat_no))")

*KAYIT OLUŞTURMAK İÇİN YAZDIĞIM KODLAR

    veriler.execute("INSERT INTO marketler(market_adi, sube_adi) 
                     VALUES ('{}', '{}')".format(market_adi.get(), sube_adi.get())) 

    veriler.execute("INSERT INTO fiyatlar(fiyat) 
                     VALUES('{}')".format(fiyat.get())) 
    
    veriler.execute("INSERT INTO urunler(barkod_no, urun_adi) 
                     VALUES ('{}' , '{}')".format(barkod_no.get(), urun_adi.get())) 
    baglan.commit()

#2

CREATE TABLE ( , ,
CONSTRAINT FOREIGN KEY () REFERENCES ()

Şeklinde anahtarları ilişkilendirmeyi deneyin

Bu linkte de örnekler mevcut
http://www.sqlkodlari.com/32-sql-foreign-key-kullanimi.asp


#3

http://www.ismailgursoy.com.tr/bir-tablodan-baska-bir-tabloya-veri-aktarimi/


#4

Oncelikle, sorunun Python ile bir alakasi yok.

fiyatlara market_no'su NULL olan satir eklemeye calisiyorsun, kolonda da NOT NULL kosulu var. Ayni hata urunlere fiyat_no=NULL eklemeye calisirken de karsina cikacak.

NULL nereden geliyor dersen, kolonu INSERT'te belirtmemissin ve default degeri NULL.


#5

Nasıl yapacağım ?
insertte belirteyim de o an var olmayan otomatik oluşacak olan bir market_no ve fiyat_no bilgisini diğer tabloya yazdırmaya çalışıyorum bunu nasıl yapabilirim ?

kodları pythonda yapmaya çalıştığımı belirtmek için yazdım başlığa Python diye.


#6

AUTOINCREMENT bir alana neden NOT NULL kısıtı koyuyorsunuz ki? Zaten o otomatik oluşan bir alan. Böyle bir kontrol yapmanıza gerek yok.


#7

yapmak istediğim olmadıkça farklı şeyler ekledim gene olmadı
yukarıda anlattığım şeyi yapacak kodu yazabilecek var mı?


#8

SQL standardinin INSERT ... RETURNING kolon olmasi lazim. Goz ucuyla baktigim kadariyla MySQL’in igrenc hack’i olan last_insert_rowid() de mevcut.