Problemi con AUTO_INCREMENT e UNIQUE

Ciao Gianni questi sono altri problemi che mi stanno sorgendo in fase di definizione dei dati:

CREATE TABLE STUDENTI

(

Matricola CHAR(10) NOT NULL,

Cod_Piano INT UNSIGNED NOT NULL,

Nome VARCHAR(20) NOT NULL,

Cognome VARCHAR(20) NOT NULL,

Data_N DATE NOT NULL,

Indirizzo VARCHAR(50) NOT NULL,

Telefono VARCHAR(15) NOT NULL,

Sesso CHAR(1) NOT NULL,

PRIMARY KEY (Matricola,Cod_Piano),

CONSTRAINT CHeck_Sex CHECK (Sesso IN (M,F))

);

Domanda: Come faccio a rendere l'attibuto Cod_Piano

diverso per tutti (penso di averlo già fatto dichiarandolo come chiave primaria, sbaglio?)

e che si incrementa ad ogni inserimento di una nuovo studente? (Questa query viene accettata)

Se nella tabella "STUDENTI" invece di dichiarare Cod_Piano come chiave primaria, la dichiaro con

la clausola UNIQUE cioè (UNIQUE(Cod_Piano)), la query "STUDENTI" funziona perchè?Con UNIQUE posso usare anche

la clausola AUTO_INCREMENT per l'attibuto Cod_Piano, quindi,ricapitolando:

perchè la query STUDENTI nn funziona se

lascio la query così come descritta sopra e aggiungo AUTO_INCREMENT all'attributo Cod_Piano,

e mi funziona con UNIQUE(Cod_Piano)?

GRAZIE MILLE PER GLI AIUTI, MI SCUSO PER AVER SBAGLIATO (MI RIFERISCO AL REGOLAMENTO....)

inviato 11 anni fa
noems
X 0 X

Non mi è chiaro il problema comunque provo a chiarire alcuni concetti.

Prima di tutto il vincolo CONSTRAINT CHeck_Sex CHECK (Sesso IN (M,F)) viene completamente ignorato da MySQL, perché non supportato. MySQL usa un'altra tecnica per ottenere lo stesso risultato.

Per quanto riguarda la chiave primaria e l'unicità dei valori di Cod_Piano, stai facendo un errore "di teoria". Con PRIMARY KEY (Matricola,Cod_Piano) dichiari come chiave primaria una coppia di attributi. Ciò significa che nella tua tabella non potranno esserci tuple con la stessa coppia "Matricola,Cod_Piano". Questo non impedisce di avere tuple con uguale Matricola o Cod_Piano. Pertanto l'unicità di Cod_Piano non viene garantita dalla chiave primaria che hai impostato.

Sempre usando questa chiave con due attributi, la clausola AUTO_INCREMENT per l'attributo Cod_Piano incrementa il suo valore solo se in un inserimento il valore della matricola è già presente nella tabella. Ciò comporta che se nella tabella hai le matricole tutte diverse allora Cod_Piano varra sempre 1.

Se non ho risposto alla tua domanda dammi maggiori dettagli.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Hia risposto in parte,il mio problema è il seguente:

Quando inserisco un nuovo studente, vorrei che automaticamente fosse assegnato a questo studente un Cod_Piano, che venga incrementato automaticamente di una unità, per ogni studente inserito, faccio un'esempio:

Matricola|Cod_Piano|ecc..

 566/955 |    0    |

 050/123 |    1    |

 345/456 |    2    | ecc...

questo è quello che vorrei avere.

risposto 11 anni fa
noems
X 0 X

allora devi mettere come chiave primaria solo il campo che vuoi incrementare e dichiararlo come AUTO_INCREMENT. Se poi vuoi rendere unico il numero di matricola allora metti un UNIQUE.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Io ho fatto esattamente il contrario....

CREATE TABLE STUDENTI

(

 Matricola VARCHAR(10) NOT NULL,

 Cod_Piano INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

 Nome VARCHAR(20) NOT NULL,

 Cognome VARCHAR(20) NOT NULL,

 Data_N DATE NOT NULL,

 Indirizzo VARCHAR(50) NOT NULL,

 Telefono VARCHAR(15) NOT NULL,

 Sesso CHAR(1) NOT NULL,

 PRIMARY KEY  (Matricola),

 UNIQUE (Cod_Piano),

 CONSTRAINT Check_Sex CHECK (Sesso IN (M,F))

);

il risultato di questa definizione, non è come quello che ti ho spiegato vero?

Quindi basta che faccio così:

CREATE TABLE STUDENTI

(

 Matricola VARCHAR(10) NOT NULL,

 Cod_Piano INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

 Nome VARCHAR(20) NOT NULL,

 Cognome VARCHAR(20) NOT NULL,

 Data_N DATE NOT NULL,

 Indirizzo VARCHAR(50) NOT NULL,

 Telefono VARCHAR(15) NOT NULL,

 Sesso ENUM ('M','F'),

 PRIMARY KEY (Cod_Piano),

 UNIQUE (Matricola),

);

Confermi?

risposto 11 anni fa
noems
X 0 X

Confermo.

 O0

risposto 11 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda