İki alannın birleşimini uniq anahtar ve index yapmak(Çözüldü)

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
softdestek
Üye
Mesajlar: 155
Kayıt: 17 Eyl 2010 03:53

İki alannın birleşimini uniq anahtar ve index yapmak(Çözüldü)

Mesaj gönderen softdestek »

Benim bir tablom var içindeki iki alanı birleştirip
YILHESAPKODU NVARHCAR(34) adlı yeni bir alan oluşturdum bu alanada index tanımladım.

Kod: Tümünü seç

SELECT @YILHESAPKODU =CONVERT(NVARCHAR(4), @YIL)+@YILHESAPKODU
Bu sayede aynı yıl verisine ait iki tane hesapkodu tanımlanamıyor. Bunu da bir triger ve ve index ile yapıyorum.
Fakat benim merak ettiğim şey şu;

İki alanın birleşimi bir alan hiç tanımlamayıp aşağıdaki iki alanın birleşimi bir uniq index tanımlayıp çok daha sade bir çözümü ms sql de elde edebilirmiyiz.

Kullanı YIL verisine 2015 hesapkodu verisine '101' girecek
Kullanıcı ikinci defa YIL verisine 2015 hesapkodu verisine '101' girdiğinde bu uniq index hata mesajı verip kayıt girişini durduracak..

Bu şekilde ek alan tanımlamadım sadece bir index ile çözüm yolu var mı MS SQL serverda

YIL INTEGER
HESAPKODU NVARCHAR(30
En son softdestek tarafından 24 May 2015 10:40 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: İki alannın birleşimini uniq anahtar ve index yapmak

Mesaj gönderen thelvaci »

softdestek yazdı:Benim bir tablom var içindeki iki alanı birleştirip
YILHESAPKODU NVARHCAR(34) adlı yeni bir alan oluşturdum bu alanada index tanımladım.

Kod: Tümünü seç

SELECT @YILHESAPKODU =CONVERT(NVARCHAR(4), @YIL)+@YILHESAPKODU
Bu sayede aynı yıl verisine ait iki tane hesapkodu tanımlanamıyor. Bunu da bir triger ve ve index ile yapıyorum.
Fakat benim merak ettiğim şey şu;

İki alanın birleşimi bir alan hiç tanımlamayıp aşağıdaki iki alanın birleşimi bir uniq index tanımlayıp çok daha sade bir çözümü ms sql de elde edebilirmiyiz.

Kullanı YIL verisine 2015 hesapkodu verisine '101' girecek
Kullanıcı ikinci defa YIL verisine 2015 hesapkodu verisine '101' girdiğinde bu uniq index hata mesajı verip kayıt girişini durduracak..

Bu şekilde ek alan tanımlamadım sadece bir index ile çözüm yolu var mı MS SQL serverda

YIL INTEGER
HESAPKODU NVARCHAR(30
Hakikatten bazen çok şaşırıyorum. SQL Server'da veritabanı tarafında trigger kodlayabiliyorsunuz, unique index'in ne olduğunu biliyorsunuz ve hatta index tanımlamayı da biliyorsunuz ama bir tablo üzerinde "Design Table" diyerek yeni bir index oluşturma ekranında birden fazla kolon seçip bunu unique yapmayı bilmiyor musunuz ? Cidden bir gariplik var..

Bazen arkadaşlarımızın öğrenmeden nasıl ilerleyebildiklerini ve bunu neden yaptıklarını anlamakta gerçekten güçlük çekiyorum doğrusu.
Kullanıcı avatarı
softdestek
Üye
Mesajlar: 155
Kayıt: 17 Eyl 2010 03:53

Re: İki alannın birleşimini uniq anahtar ve index yapmak

Mesaj gönderen softdestek »

Şaşırmaya gerek yok ...
Ben MYSQL VE FIREBIRD konusunda tecrübe sahibiyim...Sonradan biraz oracle bile öğrendim.
Procedure ve triger yazmak benim artık çok kolay bir olay interbase ve fİrebird,MYSQL sağolsun..

Firebird de yıllardır IBEXPERT aracı ile her türlü işimi çok kolay hallettim ..Fakat MS SQL de yeniyim..Daha yeni öğreniyorum.
Firebirdde çok kolay olan işleri MS SQL a yapmak biraz zor gibi geliyor fakat fazla sürmez..Onu da öğrenirim.
Trigeri dün yazdım ..İndex oluşturmayı da bir gün sonra öğrendim ..Sanırım yorgunluktan bir ara kafama durdu sanırım:-)
Bir kaç projemi birden ms sql veritabanına geçirmem gerekiyor çünkü..Bu aralar biraz yoğunum..

Cevap yazdığınız için teşekkür ederim.
İnsanın yalnız olmadığını bilmesi güzel bir duygu..


FİREBİRD İÇİN ÖRNEK :

Kod: Tümünü seç

SET SQL DIALECT 3;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE HESAPKODLAR (
    HESAPKODU  VARCHAR(30) COLLATE PXW_TURK,
    YIL        INTEGER,
    HESAPADI   VARCHAR(100) COLLATE PXW_TURK
);




/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE UNIQUE INDEX HESAPKODLAR_YILHESAPKOD ON HESAPKODLAR (YIL, HESAPKODU);
MS SQL İÇİN ÖRNEK

Kod: Tümünü seç

USE [BORSA]
GO

/****** Object:  Index [ClusteredIndex-YILHESAPKODU]    Script Date: 24.05.2015 10:30:55 ******/
CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-YILHESAPKODU] ON [MUHASEBE].[HESAPKODLAR]
(
	[YIL] ASC,
	[HESAPKODU] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)


GO
BU KODDA MS SQL İÇİN TRIGER İLE İKİ ALAN NASIL BİRLEŞTİRİLİR.

Kod: Tümünü seç

USE [BORSA]
GO
/****** Object:  Trigger [MUHASEBE].[HESAPKODLARI_Insert]    Script Date: 24.05.2015 10:18:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [MUHASEBE].[HESAPKODLARI_Insert] ON [MUHASEBE].[HESAPKODLARTUM]
INSTEAD OF INSERT
--FOR INSERT
AS
BEGIN
DECLARE @YIL INT
DECLARE @HESAPKOD NVARCHAR(30)
DECLARE @YILHESAPKODU  NVARCHAR(34)

SELECT  @YIL=YIL FROM INSERTED
SELECT  @YILHESAPKODU=HESAPKODU FROM INSERTED

SELECT @YILHESAPKODU =CONVERT(NVARCHAR(4), @YIL)+@YILHESAPKODU



INSERT INTO MUHASEBE.HESAPKODLARTUM(

  MUHASEBE.HESAPKODLARTUM.YILHESAPKODU,
  MUHASEBE.HESAPKODLARTUM.YIL,
  MUHASEBE.HESAPKODLARTUM.HESAPKODU,
  MUHASEBE.HESAPKODLARTUM.HESAPADI,
  MUHASEBE.HESAPKODLARTUM.BORC,
  MUHASEBE.HESAPKODLARTUM.ALACAK,
  MUHASEBE.HESAPKODLARTUM.BAKIYE,
  MUHASEBE.HESAPKODLARTUM.SEVIYE,
  MUHASEBE.HESAPKODLARTUM.CALISMASEKLI,
  MUHASEBE.HESAPKODLARTUM.HESAPTIPI,
  MUHASEBE.HESAPKODLARTUM.CARIKOD,
  MUHASEBE.HESAPKODLARTUM.ALT,
  MUHASEBE.HESAPKODLARTUM.BORCBAKIYE,
  MUHASEBE.HESAPKODLARTUM.ALACAKBAKIYE,
  MUHASEBE.HESAPKODLARTUM.USERGIRISADI,
  MUHASEBE.HESAPKODLARTUM.USERGIRISTIME,
  MUHASEBE.HESAPKODLARTUM.USERDEGISADI,
  MUHASEBE.HESAPKODLARTUM.USERDEGISTIME
  
  )

  SELECT  
  @YILHESAPKODU,
  inserted.YIL,
  inserted.HESAPKODU,
  inserted.HESAPADI,
  inserted.BORC,
  inserted.ALACAK,
  inserted.BAKIYE,
  inserted.SEVIYE,
  inserted.CALISMASEKLI,
  inserted.HESAPTIPI,
  inserted.CARIKOD,
  inserted.ALT,
  inserted.BORCBAKIYE,
  inserted.USERGIRISADI,
  inserted.USERGIRISTIME,
  inserted.ALACAKBAKIYE,
  inserted.USERDEGISADI,
  inserted.USERDEGISTIME
From inserted   




END
Cevapla