none
foreign key update RRS feed

  • Soru

  • sahipid, ad, tel, adres kolonlu sahip adında bir tablo ve

    petid, sahipid, ad, mchip, turid, irkid, cinsid, dtarih kololonlu pet adında ibir tablom var

    sahip.sahipid ve pet.sahipid birbiriyle ilişkili. 

        string scln = dgridsahip.CurrentRow.Cells[0].Value.ToString();    //sahipid
                        dgridsahip.Rows.Remove(dgridsahip.CurrentRow);
                        SqlCommand cmd = new SqlCommand("update pet set sahipid=1 where sahipid=@scln", classbag.baglanti);
                        cmd.Parameters.AddWithValue("@scln", scln);

             //1       cmd.ExecuteNonQuery();   

        SqlCommandBuilder cb = new SqlCommandBuilder(adpsahip);
             //2     adpsahip.Update(dtsahip);

    foreign keylerden dolayı ne update ne delete yapabiliyorum. ilişkilendirirken update için cascade i deniyorum ancak yine hata alıyorum. FK aynı zamanda PK  olduğu için set null  u kullanamıyorum.  1 ile 2 nin yerini değiştirdiğimde ise delete için aynı FK hatasını alıyorum

    sahiplere kayıtlı hayvanlar var(petler). pet lere kayıtlı aşı vs ilişkili tablolar var.  sahibi sildiğimde ona ait pet i sahipsiz hayvanlar olarak  çağırabilmem lazım. pet ile ilişkili aşı vs tablosu olmadan önce petless adlı başka bi tabloya alıyordum. sonra dedimki sahipid nin identity seed ini 2 den başlatarak  sahibi silinenlere sahipid=1 diyelim sonra listeleyelim 

    yani özetle ilişkili iki tablodan birini silicem ama ilişkili diğer tablo kalıcak bunu nasıl yapabilirim?

               
    22 Mayıs 2014 Perşembe 08:44

Yanıtlar

  • Burak,

    İlişkili kayıtları silmeden, ana kaydı silemezsin. Ayrıca, İlişkili tablodaki FK alanını Null ataman sıkıntı olur. 

    Bunu MSSQL tarafında halledebilirsin. Buradaki Makaleyi okumanda fayda var.


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Bana Ulaşmak İçin: Mail Gönder

    • Yanıt Olarak İşaretleyen Burak Akkan 22 Mayıs 2014 Perşembe 09:55
    22 Mayıs 2014 Perşembe 09:54

Tüm Yanıtlar

  • Burak,

    İlişkili kayıtları silmeden, ana kaydı silemezsin. Ayrıca, İlişkili tablodaki FK alanını Null ataman sıkıntı olur. 

    Bunu MSSQL tarafında halledebilirsin. Buradaki Makaleyi okumanda fayda var.


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Bana Ulaşmak İçin: Mail Gönder

    • Yanıt Olarak İşaretleyen Burak Akkan 22 Mayıs 2014 Perşembe 09:55
    22 Mayıs 2014 Perşembe 09:54
  • Cevap için teşekkürler sanırım ilişkilendirmeyi gereksiz yere yapmışım.
    22 Mayıs 2014 Perşembe 09:56
  • Foreign key icin On update set null on delete set null yapman yeterli. SahipId'yi 1'e kurmak gereksiz bir islem olmus. Yine de oyle yapmak istiyorum diyorsan, o zaman sahip tablosunda 1 olmali. Ya da Pet'de SahipId default 1 dersin ve On Update Set default On delete Set Default kullanirsin. Update icin cascade de kullanabilirsin. Tablo yapilarini tam vermedigin icin nerede hata yaptigin belli degil ( "FK ayni zamanda PK oldugu icin SET NULL u kullanamiyorum" demissin ki ben bunun ne demek oldugunu hic anlamadim. Senin 1-1 iliskin yok ki. 1-Cok ).

    Bu arada anti parantez, Sahip-Pet iliskisini 1-Cok tasarlamissin, ABD kaynakli bir yardim kurumunun bana yaptirdigi bir program vardi, kopeklerin Sahipleri, onlarin bakicilari vs. Orada iliski Cok-Cok seklindeydi (sahip icin olmasa da bakicilar -breeding- icin).

    Senin senaryoyu basit tablolarla test ettim, sorun yok:

    CREATE TABLE [dbo].[Sahip](
    	[SahipId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    	[ad] [varchar](10) NULL);
    
    CREATE TABLE [dbo].[Pet](
    	[PetId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    	[SahipId] [int] NULL,
    	[ad] [varchar](10) NULL
    );
    
    ALTER TABLE [dbo].[Pet]  WITH CHECK ADD  CONSTRAINT [FK_Pet_Sahip] FOREIGN KEY([SahipId])
    REFERENCES [dbo].[Sahip] ([SahipId])
    ON UPDATE SET NULL
    ON DELETE SET NULL;
    
    
    INSERT INTO [Sahip] ( [ad] ) VALUES  ( 'Ahmet' );
    INSERT INTO [Sahip] ( [ad] ) VALUES  ( 'Mehmet' );
    INSERT INTO [Sahip] ( [ad] ) VALUES  ( 'Huseyin' );
    INSERT INTO [Sahip] ( [ad] ) VALUES  ( 'Ali' );
    
    INSERT INTO [Pet] ( [SahipId], [ad] ) VALUES  ( 1, 'Rocky' );
    INSERT INTO [Pet] ( [SahipId], [ad] ) VALUES  ( 2, 'Bobby' );
    INSERT INTO [Pet] ( [SahipId], [ad] ) VALUES  ( 3, 'Sweety' );
    INSERT INTO [Pet] ( [SahipId], [ad] ) VALUES  ( 4, 'Goofy' );
    
    
    
    SELECT * FROM Sahip FULL JOIN Pet ON [Sahip].[SahipId] = [Pet].[SahipId];
    
    --SahipId     ad         PetId       SahipId     ad
    ------------- ---------- ----------- ----------- ----------
    --1           Ahmet      1           1           Rocky
    --2           Mehmet     2           2           Bobby
    --3           Huseyin    3           3           Sweety
    --4           Ali        4           4           Goofy

    * Ali'nin petini sahipsiz birak (Delete in Sahip),

    Not: Buradaki SQL'lerde Ad alanlari unique imis gibi bir kullanim var. Gercek hayatta asla yapilacak sey degil ancak ornek icin kullanilabilir, DataGridView'dan gorerek birsey secmek gibi kabul edilebilir. Gorerek secmek yerine adlari bu ornek veride unique olarak kullanmis olmaktan faydalandik.

    void DeleteSahip()
    {
      using(SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=test;Trusted_Connection=yes"))
      {
        SqlCommand cmdDelete = new SqlCommand("Delete from Sahip output deleted.SahipId where ad = @ad", con);
        cmdDelete.Parameters.AddWithValue("@ad", "Ali");
        
        con.Open();
        int id = (int)cmdDelete.ExecuteScalar();
        con.Close();
        Console.WriteLine ("Sahip Id: {0} silindi", id);
      }
    }

    Sahip Id: 4 silindi
    
    
    SELECT * FROM Sahip FULL JOIN Pet ON [Sahip].[SahipId] = [Pet].[SahipId];
    
    
    --SahipId     ad         PetId       SahipId     ad
    ------------- ---------- ----------- ----------- ----------
    --1           Ahmet      1           1           Rocky
    --2           Mehmet     2           2           Bobby
    --3           Huseyin    3           3           Sweety
    --NULL        NULL       4           NULL        Goofy

    * Sweety'i Ahmet'e ver - ID 1 (Update in Pet).

    void UpdateSahip()
    {
      using(SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=test;Trusted_Connection=yes"))
      {
        SqlCommand cmdUpdate = new SqlCommand("Update Pet set SahipId = @sahip output deleted.SahipId where ad = @ad", con);
        cmdUpdate.Parameters.AddWithValue("@sahip", 1);
        cmdUpdate.Parameters.AddWithValue("@ad", "Sweety");
        con.Open();
        int id = (int)cmdUpdate.ExecuteScalar();
        con.Close();
        Console.WriteLine ("Pet: {0}, Eski sahip Id: {1}, Yeni sahip Id: {2}", 
          cmdUpdate.Parameters["@ad"].Value, 
          id, 
          cmdUpdate.Parameters["@sahip"].Value);
      }
    }

    Pet: Sweety, Eski sahip Id: 3, Yeni sahip Id: 1
    
    SELECT * FROM Sahip FULL JOIN Pet ON [Sahip].[SahipId] = [Pet].[SahipId];
    
    
    --SahipId     ad         PetId       SahipId     ad
    ------------- ---------- ----------- ----------- ----------
    --1           Ahmet      1           1           Rocky
    --1           Ahmet      3           1           Sweety
    --2           Mehmet     2           2           Bobby
    --3           Huseyin    NULL        NULL        NULL
    --NULL        NULL       4           NULL        Goofy

    22 Mayıs 2014 Perşembe 11:04
  • On Delete Set Null (ya da default) ile silebilirsin. Bence bu son derece normal bir islem.
    22 Mayıs 2014 Perşembe 13:53
  • Iliskilendirmeyi hic yapmamak daha buyuk hata (nacizane fikrim).
    22 Mayıs 2014 Perşembe 13:53