Kako da postavim vise kolona na index u MySql

Radomi Mihajlovic

Zainteresovan član
Poruka
104
Zelim da koristim vise indexa nad jewdnom tabelom a ne primary key. Znam punoi toga o indexima i B-stablu kao i primarnom i sekundarnim kljucevima kao i o normalizacioji baze. Koristim MySql i dosta sam procitao i MySql-u i trazio po netu primer gde se upotrebljava SELET, INSERT, UPDATE nad tabelom koja ima 5 indexa. Tabela je radgk (radna baza za glavnu knjigu za one koji se razumeju u knjigovodstvo) indexi si godgk CHAR (4) (godina recimo "2018"), brnalogafp CHAR (4) ( broj naloga "60"), kontogk CHAR (8) (konto "2020"), stavkagk CHAR (20)(opis atavke "racun-123"), sifmtgk CHAR(10)(sifra mesta troska "1000"). Index je u ovom redosledu. Kada pokusam sledece dobijam poruku o neupisivanje podataka u tabelu. Evo dela programa

string wnadimt = "SELECT godgk, kontogk, brnalgk, dugujegk, potrazgk, stavkagk, sifmtgk " +
"FROM radgk WHERE godgk=@godgk + kontogk=@kontogk +
brnalgk=@brnalgk + stavkagk=@stavkagk + sifmtgk=@sifmtgk";
MySqlCommand cmdag = new MySqlCommand(wnadimt, conmt);
cmdag.Parameters.AddWithValue("@godgk", qgodina);
cmdag.Parameters.AddWithValue("@kontogk", wkontogk);
cmdag.Parameters.AddWithValue("@brnalgk", qbrnalf);
cmdag.Parameters.AddWithValue("@stavkagk", wstavkarp);
cmdag.Parameters.AddWithValue("@sifmtgk", wsifmtgk);
System.Data.Common.DbDataReader reader = await cmdag.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
string pduguje = reader["dugujegk"].ToString().Trim();
string ppotraz = reader["potrazgk"].ToString().Trim();
if (pduguje != "")
{
wimadugujegk = 1;
zbirdug = System.Convert.ToDecimal(pduguje);
zbirpot = 0;
}
if (ppotraz != "")
{
wimapotrazgk = 1;
zbirpot = System.Convert.ToDecimal(ppotraz);
zbirdug = 0;
}
}
reader.Close();
}
conmt.Close();

evo i primera sa INSERET

MySqlConnection cona;
myConnectionString = pwput;
cona = new MySql.Data.MySqlClient.MySqlConnection();
cona.ConnectionString = myConnectionString;
try
{
cona.OpenAsync();
if (cona.State == ConnectionState.Open)
{
int qkontogk = Convert.ToInt32(wkontogk);
//int qbrnalgk = Convert.ToInt32(wbrnalogafp);
string upisi = "INSERT INTO radgk (godgk, kontogk, brnalgk, datnalgk, stavkagk, vrdokgk, datracgk, rokplgk, dugujegk, potrazgk, dpogk, sifmtgk, vezadokgk )" +
" VALUES (@godgk, @kontogk, @brnalgk, @datnalgk, @stavkagk, @vrdokgk, @datracgk, @rokplgk, @dugujegk, @potrazgk, @dpogk, @sifmtgk, @vezadokgk )";
tran = cona.BeginTransaction();
MySqlCommand cmda = new MySqlCommand(upisi, cona);
cmda.Transaction = tran;
cmda.Parameters.AddWithValue("@godgk", wgodina);
cmda.Parameters.AddWithValue("@kontogk", qkontogk);
cmda.Parameters.AddWithValue("@brnalgk", wbrnalogafp);
cmda.Parameters.AddWithValue("@datnalgk", wdatumnaloga);
cmda.Parameters.AddWithValue("@stavkagk", wstavkarp);
cmda.Parameters.AddWithValue("@vrdokgk", wsifdok);
cmda.Parameters.AddWithValue("@datracgk", wdatumdok);
cmda.Parameters.AddWithValue("@rokplgk", wrokplrp);
cmda.Parameters.AddWithValue("@sifmtgk", wsifmtgk);
cmda.Parameters.AddWithValue("@dpogk", wdporp);
cmda.Parameters.AddWithValue("@vezadokgk", wvezadokrp);
if ((dduguje != 0) & (wbiodug == 0))
{
cmda.Parameters.AddWithValue("@dugujegk", dduguje);
cmda.ExecuteNonQuery();
tran.Commit();
cona.Close();
//wpotraz = "0";
return;
}
if ((dpotraz != 0) & (wbiopot == 0))
{
cmda.Parameters.AddWithValue("@potrazgk", dpotraz);
cmda.ExecuteNonQuery();
tran.Commit();
cona.Close();
//wduguje = "0";
return;
}
}
else
{
MessageBox.Show(" NISTE USPELI DA SE KONEKTUJETE NA SERVER\r\n ZATVORITE PROGRAM PA POKUSAJTE PONOVO \r\n");
}
}
catch (MySqlException ex)
{
try
{
tran.Rollback();
MessageBox.Show(" DOŠLO JE DO GREŠKE PRI UPISU PODATAKA U GLAVNU KNJIGU\r\nKAKO OVI PODACI NISU UPISANI PROVERITE PA PONOVITE UPIS !! ");
}
catch (MySqlException ex1)
{
MessageBox.Show(" DOŠLO JE DO GREŠKE PRI UPISU PODATAKA U BAZU\r\nKAKO OVI PODACI NISU UPISANI, PONOVITE UPIS !! ");
}
finally
{
if (cona.State == ConnectionState.Open)
{
cona.Close();
}
}
switch (ex.Number)
{
case 0:
MessageBox.Show(" NISTE USPELI DA SE KONEKTUJETE NA SERVER, ZATVORITE PROGRAM PA POKUSAJTE PONOVO");
Close();
break;
case 1042:
MessageBox.Show(" NIJE AKTIVAN SERVER, PODIGNITE SERVER PA PONOVITE KONEKTOVANJE ");
Close();
break;
}
}:roll:


Hvala na vremenu
 
Nije u pitanju scenario vec potreba u knjigovodstvu kod otvorenih stavki, jer mora da se pronadje konto, sifra kupca, opis stavke, duguje ili potrazuje. Primarni kljuc je dosta sporiji kod pretraga mada zauzima manje mesta na disku. Indeksi pretrazuju po B-stablu i zato je mnogo brza pretraga ali druga strana medalje je sto zauzimaju vise prostora da disku tj. uz samu tabelu podataka smestaju i indekse. primarni i sekundarni kljucevi su namenjeni za rad sa povezanim tabelama, indexi to ne mogu.
Rseio sam problem nije bio u mom programu vec u registri bazi windowsa 10.
Zahvaljujem se na pomoci.
 
Primarni kljuc je, u dubini, implementiran na isti nacin kao indeks - dakle i on je spakovan u B-Tree strukturue. Primarni kljuc je samo apstrakcija Data Definition Language-a baze podataka, nista drugo.
Indeksi su zadrzali upotrebu samo zbog backward kompatibilnosti, inace kompletna njihova funkcija je preuzeta pomocu primarnog kljuca.
Sekundarni kljuc je nesto sto se nigde ne definise posebno, predstavlja iskljucivo neku proizvoljnu kolonu (ili skup kolona) koja bi trebalo da je u stanju da jedinstveno odredi zapis u tabeli. U sustini, to se skoro nigde i ne koristi. Ono sto si ti mozda mislio pod sekundarnim kljucem, je Foreign Key - preneseni kljuc, koji sluzi da bismo definisai vezu izmedju dve tabele.

Danas (i zadnjih 20 godina, od kada sam u ovim vodama), sve tabele u relacionim bazama podataka, kreiraju se tako sto svaka ima svoj primary key, a relacije izmedju njih se uspostavljaju putem foreign key-a.
I to je to, bez neke velike filozofije - radi brzo, precizno, jednoznacno, i umogucuje ti vrlo lako da pravis sve vrste upita, transakcija i stored procedura, kao i trigger-a, i svega ostalog.
A sve je to jos dodatno unapredjeno onog trenutka kada je GUID tip podataka (UNIQUEIDENTIFIER) poceo da se koristi kao tip podataka za primarni kljuc - obezbedjena je jednoznacnost svih podataka u bazi podataka, ne samo na nivou tabele, i ostavljeno je programeru da moze da definise neverovatno kompleksne upite, koji ce se izvrsavati sa 100% tacnoscu.
 
Poslednja izmena:

Back
Top