Help! MySQL

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Deci am o saptamana libera si m-am apucat iar de scris la program.
Am un tabel care are drept cheie primara un ID care trebuie sa respecte niste reguli: 8 cifre data calendaristica, 4 cifre variabile si inca 2 cifre fixe. Cum fac sa generez cele 4 cifre variabile astfel incat codul sa fie unic?

- Varianta 1: Caut ultimul cod ocupat, adaug 1 la cifrele variabile si incerc introducerea codului nou. Daca da eroare, +1 si incerc din nou.

- Varianta 2: O comanda SQL cu INSERT ... SELECT pe care nu reusesc s-o scriu. Please, help!
Am incercat:
Code:
INSERT INTO tabel (PID, col1, col2, col3)
SELECT CURENT_DATE || LPAD(MAX(PID)+1,4,'0') || '01 AS 'PID', 'val1' AS 'col1', 'val2' AS 'col2', 'val3' AS 'col3'
FROM tabel
WHERE LEFT(PID,8)=CURRENT_DATE;
Dar daca nu-i nici o linie care sa satisfaca conditia WHERE, adica situatia unde introduc primul rand cu prefixul ala, rezultatul va fi null. Cum fac sa-mi genereze 20171018 0000 01?

LE: Nu mai e nevoie. A mers cu:
COALESCE(MAX(parte_din_PID),-1)
O hidoșenie, comanda aia... Sper sa nu trebuiasca sa umblu la ea niciodata!
 
Last edited:

AdrianB1

Membru Senior
Sugar daddy
Joined
Aug 3, 2004
Location
offline
Tu ai o problema: nu intelegi notiunea de cheie primara si nu intelegi ca nu intelegi asta. De fapt, nu stiu daca intelegi ca nu intelegi ceea ce nu intelegi sau intelegi, dar faci trolling.

Ce ai acolo e o carpeala. Da, e a ta, e geniala daca vrei tu, dar de fapt e o carpeala. De ce ne povestesti despre ea, vrei sa invatam cum sa facem chestii pe care am fost invatati sa nu le facem?
 

puterfixer

Administrator
Sugar daddy
Joined
Oct 30, 2003
Mai succint: cheia primară e un cod fără un înțeles propriu, cu singurul scop de a fi unică și a lega înregistrări din tabele diferite între ele. Data și ce mai zici tu acolo sunt alte câmpuri ale înregistrării, având semnificație proprie. Când înțelegi și aplici asta, avem baza de la care să putem discuta mai departe.
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Nu vad nicaieri scris ca o cheie primara nu trebuie sa aiba semnificatie proprie. WTF? De ce nu?? Dar, bine, poate chiar nu inteleg ce-i aia cheie primara.
La ce imi foloseste o cheie primara care n-are absolut nici o semnificatie proprie? Oricum am o coloana cu valori unice care trebuie sa respecte formatul de mai sus si care trebuiesc generate prin aceeasi "carpeala", indiferent daca este sau nu cheie primara. De ce sa n-o fac pe aia cheie primara? Cu ce ma incurca?
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Location
Unreal Estate, Ankh-Morpork, Discworld
Cheia primară nu are semnificație de business, e acolo pentru a organiza datele corect. Nu faci cheie primară un câmp de business pentru că dacă peste 3 zile îți dai seama că de fapt câmpul ăla nu e unic (pentru că brusc vrei să păstrezi două versiuni diferite ale acelui obiect, de genul istoric) va trebui să adaugi alt câmp ca PK. Ceea ce trebuia să faci de la început.

E ca și cum ai pune CNP-ul cheie primară, că doar e unic - yeah, right.
 

puterfixer

Administrator
Sugar daddy
Joined
Oct 30, 2003
Singurul scop al cheii primare e să lege înregistrări. Altfel, nu ar trebui să o folosești pentru altceva, să o parsezi, să o compui sau să o afișezi. Nu este "user data", din motive ce țin și de performanță, și de separare a datelor de structură. La fel, un câmp care se întâmplă să fie unic nu e neapărat potrivit să fie și cheie primară. Mai știu inteligenți care s-au gândit că CNP-ul e bun de cheie primară și apoi și-au dat cu tesla-n floapă.

Cel mai bun mod de a te gândi la cheie e că e un "ceva" ambiguu, definit într-o anume tabelă unde e "master" și folosit ca "foreign" în orice altă tabelă legată relațional (și cu o anumită regulă de enforced relationship). Ce e acel "ceva", că e număr auto incrementat sau timestamp sau string random, nu e treaba ta și nu ar trebui să-ți pese. E acolo doar pentru ca să asigure conceptul de bază de date relaționale, nu și pentru a avea o semnificație sau înțeles logic pentru aplicație.

[edit] ^5 miahi că am postat același lucru simultan :biggrin:
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Ei, pisici! Bineinteles ca am pus CNP-ul cheie primara. E asa de 15 ani si n-au fost probleme. Dar nu despre el era vorba.
Era vorba despre generatul unui cod unic dupa un anumit format, indiferent daca este sau nu cheie primara. Si sunt absolut sigur ca trebuie sa fie unic - e codul probei.
 

AdrianB1

Membru Senior
Sugar daddy
Joined
Aug 3, 2004
Location
offline
Don't go that route. S-ar putea sa te trezesti cu contraexemple de la moastele Paraschievei unde numerele sunt clar defavorabile oricarei discutii inteligente.

Mie imi plac mult cheile primare autonumber: in afara faptului ca sunt banal de implementat si nu implica nici un efort substantial din nici o parte (in MS SQL doar se seteaza ca autonumber cu numar initial si step, tip inte, nu consuma spatiu semnificativ in baza de date) mai au avantajul ca in cazurile in care datele nu se sterg, ci doar se inactiveaza, ajuta sa descoperi foarte usor cand lipseste un numar din secventa. Mi-a folosit in realitate in mai multe cazuri, de la date corupte la importuri de date esuate.
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Location
Unreal Estate, Ankh-Morpork, Discworld
De obicei nu te poți baza pe faptul că un astfel de generator de numere îți dă numere în ordine și gapless, ci doar unice. Asta pentru că fiecare tranzacție trebuie să primească numărul propriu, iar dacă se face rollback numărul e pierdut. Chiar am avut o cerință de business pentru un generator sortat și gapless pentru Oracle și a fost foarte trist (toate tranzacțiile care atingeau numărul ăla se serializau transparent, pentru că nu putea fi generat numărul următor până nu făcea commit tranzacția anterioară). Cum e la MS SQL?
 

AdrianB1

Membru Senior
Sugar daddy
Joined
Aug 3, 2004
Location
offline
Tocmai ca un gap imi indica faptul ca a fost o problema de care altfel poate nu as fi stiut. Oamenii din jur (virtual, ca sunt la mii de km) genereaza mult mai mult cod decat pot sa auditez, asa ca ma uit periodic prin baze si e unul din indicatorii unor posibile probleme.

MS SQL iti genereaza numere in serie chiar si pentru tentative (tranzactii), daca tranzactia esueaza atunci vezi fix un gap cat pentru toate inregistrarile respective. Nu poti face nimic gapless direct din autonumber dar nu e un bug in nici un caz.
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Sa zicem ca faceti baza de date pentru o firma care lucreaza in baza unor comenzi de la clienti (tot firme). Comenzile sunt in baza unor contracte deja existente.
La voi, nr. comenzii este unic pe client/contract sau unic global? Numerele sunt consecutive sau pe sarite? Sunt in ordine cronologica?
Intreb pentru ca trebuie sa ma decid cum sa le generez sau daca sa las utilizatorul sa le introduca.
 

puterfixer

Administrator
Sugar daddy
Joined
Oct 30, 2003
O să ai un ID numeric unic în tabela de comenzi, pe post de cheie primară, dar pe care nu-l folosești decât în relațiile între tabele (de exemplu, cu tabela subordonată „elemente ale comenzii”, astfel separând detaliile generale ale unei comenzi de fiecare linie din comandă, vezi discuția despre normalizare). O să ai un cod comandă așa cum este trimisă de client, pe care o vei folosi în alte documente, inclusiv livrări aferente comenzii cutare și factură aferentă comenzii cutare. Dacă chiar vrei neapărat (sau dacă clientul nu își codifică comenzile), îți poți genera și tu un cod de comandă pentru uz intern, ceva care să fie cât de cât inteligibil pentru cine trebuie să îl înțeleagă, și astfel după un pattern care are sens - gen, cod de 3 litere al clientului urmat de ultimele două cifre ale anului urmat de un cod numeric de x cifre ca serial number al tuturor comenzilor primite în acel an.

Dar detaliile despre ce informații sunt necesare pentru uz intern și pe ce documente să fie afișate, astea ți le dau userii. Poate nici n-are sens să inventezi coduri de comandă interne că nu sunt folosite niciunde. Poate trebuie însă să generezi multe alte coduri pentru, io știu, mostrele biologice primite, pașii intermediari de procesare a analizelor, rezultatele fiecăreia, astfel încât să ai o granularitate a tuturor activităților într-o formă normală a bazei de date, și toate să se lege între ele prin chei străine.
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Situatie:
Vine clientul, cere X si Y analize decontate de Casa. Se inregistreaza cererea 1 si i se recolteaza proba A. =>rezultate.
A doua zi vine iar si zice ca mai vrea analiza Z, platita de el, dar sa se lucreze tot din proba de ieri. Rezulta cererea 2, tot pentru proba A.

Pana acum a existat doar numar proba, dar dupa cum vezi, e nevoie si de nr. cerere.
 

AdrianB1

Membru Senior
Sugar daddy
Joined
Aug 3, 2004
Location
offline
Daca stii care e relatia intre clienti, probe, cereri si rezultate atunci poti desena corect structura bazei de date. Relatie inseamna in general: 1 la 1, 1 la multi, multi la multi.
 
Top Bottom