ugrás a tartalomhoz

AUTO INCREMENT plusz saját forma

szobek · 2013. Okt. 10. (Cs), 08.35
Sziasztok!

Egy látszólag egyszerű kérdésem lenne, de konkrét választ még nem találtam.
A lényege, hogy szeretnék egy felhasználói adatbázist létrehozni, de szükségem lenne egy olyan oszlopra a mysql táblában, ahol én határozom meg a felhasználó azonosítóját, de úgy hogy az auto increment megmarad.
Nézzük a példát:
Felveszek egy új felhasználót -> neki van egy beosztása vagy egy csoport tagja, így a kódja pl: F1002
Felveszek egy másikat -> neki a beosztása miatt pl: G1002

Tehát a betű változhat de a szám is automatikusan nőjön mindig eggyel.

Na most ezt valahol be lehet állítani alapértékként a mysql-ben, vagy maradnom kell az alap megoldásnál, hogy kiolvasom a legutolsó sort ahol az azonosító ezzel a betűvel kezdődik, majd növelem eggyel az értékét és ezt adom meg azonosítóként?

Illetve a másik fele: hogyan tudom megadni, hogy az id 1000-től kezdődjön?

Válaszotokat és segítségeteket előre is köszönöm!

Szobek
 
1

Kedves Szobek! Az AUTO

tisch.david · 2013. Okt. 10. (Cs), 08.52
Kedves Szobek!

Az AUTO INCREMENT a numerikus mezők sajátja, és pont arra való, hogy külső beavatkozás nélkül biztosítsa a rekord egyediségét. Te szöveges kódot szeretnél, ráadásul logikával vezérelten szeretnéd azt kiosztani, úgyhogy erre az a megoldás, amit Te is említesz: lockolod a táblát, lekéred a legnagyobb azonosítót a csoporton belül, eggyel nagyobb értékkel kiosztod az új kódot és elengeded a táblát. Én talán a betű kódot és a számot két külön mezőben tárolnám a könnyebb kezelhetőség miatt, de ez a lényeget nem érinti.

Üdv:

Dávid
2

Köszönöm a választ, már csak

szobek · 2013. Okt. 10. (Cs), 09.02
Köszönöm a választ, már csak egy kérdés maradt függőben, mégpedig, hogy ha maradok az alap felállásnál és megfogadva a tanácsodat külön kezelem a betűket, akkor hogyan tudom azt megadni a táblában, hogy az azonosító 1000-től kezdődjön?
Mert akkor lehet, hogy külön táblában is kezelem a különböző felhasználókat, úgy is elég sok adat lenne, csak azt nem tudom, hogy hogyan lehet megadni az alap értéket, ahonnan induljon az auto increment.

Köszönöm előre is a választ
3

AUTO_INCREMENT = 1000

asam9 · 2013. Okt. 10. (Cs), 09.13
CREATE TABLE IF NOT EXISTS `table_name` (
	`id` int unsigned NOT NULL AUTO_INCREMENT,
	...
	PRIMARY KEY (`id`),
) ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1000;
4

Köszönöm a gyors választ,

szobek · 2013. Okt. 10. (Cs), 09.26
Köszönöm a gyors választ, gondolom itt az unsigned és az utolsó adat a lényeg.

Még egyszer köszönöm!

Szobek
5

Szívesen :) Igen, az

asam9 · 2013. Okt. 10. (Cs), 09.56
Szívesen :) Igen, az AUTO_INCREMENT = 1000 a lényeges neked.

Az UNSIGNED pedig:
A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.
6

Az unsigned tehát csak akkor

szobek · 2013. Okt. 10. (Cs), 10.27
Az unsigned tehát csak akkor lényeg ha nincs előjel. Tehát ha csak "pozitív" számokat használok és nem lényeg, hogy nagyobb értéket tudjak felvenni mint 2147483647 hanem elég nekem a 9999 akkor nem is kell foglalkoznom ezzel a beállítással? Egyébként melyik az alapértelmezett? A signed?
7

Kérdéseidre pontos és gyors

Hidvégi Gábor · 2013. Okt. 10. (Cs), 10.37
Kérdéseidre pontos és gyors választ találhatsz a hivatalos mysql dokumentációban is.
8

Igen, akkor nem kell vele

asam9 · 2013. Okt. 10. (Cs), 10.41
Igen, akkor nem kell vele foglalkoznod, de úgy sem fogsz negatív értéket használni, így miért ne lenne UNSIGNED... az alapértelmezett a SIGNED.
9

Rendben értem, köszönöm

szobek · 2013. Okt. 10. (Cs), 10.58
Rendben értem, köszönöm szépen a válaszokat!
10

Egyrészt ha nincs valóban

tgr · 2013. Okt. 10. (Cs), 11.18
Egyrészt ha nincs valóban szükséged arra, hogy az adott típusú felhasználók id-i folytonosak legyenek (autoincrementtel egyébként valószínűleg úgysem lesznek), akkor használj egyszerűen egy közös tartományt, és egy összetett kulcsot:

CREATE TABLE `user` (
    type CHAR(1),
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,  
    ...  
    PRIMARY KEY (type, id),  
) AUTO_INCREMENT = 1000;  
Másrészt ha valamiért mégis külön id tartományok kellenek, használhatsz külön táblákat az okosabb adatbáziskezelőkben ezt a funckiót ellátó szekvenciák szimulálására, pl. így.
11

Csoportok?

Pepita · 2013. Okt. 10. (Cs), 16.26
Az id-re meg van a jó megoldásod, én viszont azt látom, hogy valamiféle jogosultság (vagy csoport) kezelést is meg szeretnél valósítani.
neki van egy beosztása vagy egy csoport tagja
Ezt leginkább három táblában tudod megtenni, mondjuk users, roles, users_roles.
A users-ben van egy u_id (ez az autoinkrement), a roles-ben egy r_id, persze mindkettőben a többi szükséges mezőkkel.
A usrs_roles pedig csak u_id és r_id oszlopokból áll. (Ez a merge tábla.)
Így meg tudod valósítani (kellő kaszkádolás mellett), hogy egy usernek tetszőleges számú jogosultsága legyen (vagy több csoportba is tartozzon).
A users_roles tábla két oszlopa együttesen kell kulcsot alkosson.

Lekérdezésnél okosan összefűzött JOIN, és akár szövegesen is kiírod a csoportjait (ha van erre oszlopod a roles-ban), valamint viszonylag könnyen tudok őket "tologatni" csoportból ki-be.

Szándékosan nem írtam konkrét kódot hozzá, járj utána, érdemes! MyIsam táblákkal nem fog menni, InnoDB kell.
Kulcsszavak: CONSTRAINT, FOREIGN KEY, REFERENCES, ON DELETE, ON UPDATE.