Visualizzazione di DEFAULT non rischiesta

Ciao Gianni,

perchè se carico la struttura del mio db con il file "Definizione Tabelle" riportato di seguito:

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') NOT NULL DEFAULT 'M',

 UNIQUE (Matricola),

 PRIMARY KEY (Cod_Piano)

) ENGINE=INNODB;

CREATE TABLE ESAMI

(

 Cod_Esame CHAR(3) NOT NULL,

 Titolo VARCHAR(30) NOT NULL,

 Contenuti TEXT NOT NULL,

 Tipo_Attivita VARCHAR(8) NOT NULL,

 Prova_Fin ENUM ('E','K','C') NOT NULL DEFAULT 'E',

 CFU SMALLINT(2) NOT NULL,

 Tipo ENUM ('O','F') NOT NULL DEFAULT 'O',

 PRIMARY KEY (Cod_Esame)

) ENGINE=INNODB;

CREATE TABLE ANNI

(Cod_E CHAR(3) NOT NULL,

 Anno ENUM ('1','2','3') NOT NULL,

 PRIMARY KEY (Cod_E,Anno),

 FOREIGN KEY (Cod_E) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE PIANI

(Mat CHAR(10) NOT NULL,

 Cod_P INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

 Cod_Esami CHAR(3) NOT NULL,

 Anno ENUM ('1','2','3') NOT NULL,

 Data_P DATE DEFAULT 'NULL',

 Voto SMALLINT(2) DEFAULT 'NULL' CHECK (Voto BETWEEN 18 AND 30),

 Lode ENUM ('S','N') DEFAULT 'N',

 PRIMARY KEY (Mat,Cod_P,Cod_Esami),

 FOREIGN KEY (Mat) REFERENCES STUDENTI(Matricola)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_P) REFERENCES STUDENTI(Cod_Piano)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_Esami) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE PROPEDEUTICI

(

 Cod_Esa CHAR(3) NOT NULL,

 Cod_Prop CHAR(3) NOT NULL,

 PRIMARY KEY (Cod_Esa,Cod_Prop),

 FOREIGN KEY (Cod_Esa) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_Prop) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

e poi faccio la seguente query:

INSERT INTO STUDENTI VALUES ('566/955','','Roberto','Cuccurese','1983-07-22','Via Domenico Padula 145','081/7263741','');

perchè quando scelgo l'opzione mostra in phpmyadmin compare la riga:

566/955 | 1 | Roberto | Cuccurese | 1983-07-02 | Via Dome... | 081... |         

quindi perchè per l'attributo Sesso non viene mostrato il valore di DEFAULT messo in fase di dichiarazione tabella?

Ed Inoltre perchè se carico la struttura del mio DB sempra con il file "Definizione Tabelle" e poi faccio la seguente query in MySQL:

DESCRIBE ESAMI

per l'attributo CFU compare il valore di default '0' (zero) pur non avendolo settato in fase di definizione tabelle? Lo stesso accade anche in altre tabelle, come si può vedere dal seguente file di dump:

Database piani_di_studio

# phpMyAdmin MySQL-Dump

# version 2.2.1

# http://phpwizard.net/phpMyAdmin/

# http://phpmyadmin.sourceforge.net/ (download page)

#

# Host: localhost

# Generato il: 21 Set, 2005 at 10:14 PM

# Versione MySQL: 4.01.08

# Versione PHP: 5.0.5

# Database : `piani_di_studio`

# --------------------------------------------------------

#

# Struttura della tabella `anni`

#

CREATE TABLE anni (

  Cod_E char(3) NOT NULL default '',  <----------

  Anno enum('1','2','3') NOT NULL default '1',  <----------

  PRIMARY KEY  (Cod_E,Anno),

  CONSTRAINT anni_ibfk_1 FOREIGN KEY (Cod_E) REFERENCES esami (Cod_Esame) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB ;

# --------------------------------------------------------

#

# Struttura della tabella `esami`

#

CREATE TABLE esami (

  Cod_Esame char(3) NOT NULL default '', <----------

  Titolo varchar(30) NOT NULL default '', <----------

  Contenuti text NOT NULL,

  Tipo_Attivita varchar(8) NOT NULL default '', <----------

  Prova_Fin enum('E','K','C') NOT NULL default 'E',

  CFU smallint(2) NOT NULL default '0', <----------

  Tipo enum('O','F') NOT NULL default 'O',

  PRIMARY KEY  (Cod_Esame)

) ENGINE=InnoDB ;

# --------------------------------------------------------

#

# Struttura della tabella `piani`

#

CREATE TABLE piani (

  Mat char(10) NOT NULL default '', <----------

  Cod_P int(10) unsigned NOT NULL auto_increment,

  Cod_Esami char(3) NOT NULL default '', <----------

  Anno enum('1','2','3') NOT NULL default '1',

  Data_P date default '0000-00-00', <----------

  Voto smallint(2) default '0', <----------

  Lode enum('S','N') default 'N',

  PRIMARY KEY  (Mat,Cod_P,Cod_Esami),

  KEY Cod_P (Cod_P),

  KEY Cod_Esami (Cod_Esami),

  CONSTRAINT piani_ibfk_1 FOREIGN KEY (Mat) REFERENCES studenti (Matricola) ON DELETE CASCADE ON UPDATE CASCADE,

  CONSTRAINT piani_ibfk_2 FOREIGN KEY (Cod_P) REFERENCES studenti (Cod_Piano) ON DELETE CASCADE ON UPDATE CASCADE,

  CONSTRAINT piani_ibfk_3 FOREIGN KEY (Cod_Esami) REFERENCES esami (Cod_Esame) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB ;

# --------------------------------------------------------

#

# Struttura della tabella `propedeutici`

#

CREATE TABLE propedeutici (

  Cod_Esa char(3) NOT NULL default '', <----------

  Cod_Prop char(3) NOT NULL default '', <----------

  PRIMARY KEY  (Cod_Esa,Cod_Prop),

  KEY Cod_Prop (Cod_Prop),

  CONSTRAINT propedeutici_ibfk_1 FOREIGN KEY (Cod_Esa) REFERENCES esami (Cod_Esame) ON DELETE CASCADE ON UPDATE CASCADE,

  CONSTRAINT propedeutici_ibfk_2 FOREIGN KEY (Cod_Prop) REFERENCES esami (Cod_Esame) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB ;

# --------------------------------------------------------

#

# Struttura della tabella `studenti`

#

CREATE TABLE studenti (

  Matricola varchar(10) NOT NULL default '', <----------

  Cod_Piano int(10) unsigned NOT NULL auto_increment,

  Nome varchar(20) NOT NULL default '', <----------

  Cognome varchar(20) NOT NULL default '', <----------

  Data_N date NOT NULL default '0000-00-00', <----------

  Indirizzo varchar(50) NOT NULL default '', <----------

  Telefono varchar(15) NOT NULL default '', <----------

  Sesso enum('M','F') NOT NULL default 'M',

  PRIMARY KEY  (Cod_Piano),

  UNIQUE KEY Matricola (Matricola)

) ENGINE=InnoDB ;

ad esempio per la tabella STUDENTI, il valore di default compare vicino a DATA (0000-00-00), ed altri (indicati con la freccia).

GRAZIE

inviato 11 anni fa
noems
X 0 X
perchè per l'attributo Sesso non viene mostrato il valore di DEFAULT messo in fase di dichiarazione tabella?

perche il tipo ENUM è un po' strano... oltre ai valori che hai specificato può assumere il valore di una stringa vuota. Questo accade quando si cerca di inserire un valore non presente nell'insieme di valori possibili dell'attributo. Nella tua insert hai specificato una stringa vuota come valore dell'attributo "sesso" e questa non essendo un valore possibile è stata memorizzata come una stringa vuota (è solo una coincidenza!). Anche se avessi inserito come valore di "sesso" il numero 12345 questo sarebbe stato memorizzato come una stringa vuota.

Per memorizzare con una insert il valore di default di un attributo devi usare la parola chiave DEFAULT oppure la insert non deve proprio contemplarlo:

INSERT INTO studenti (Matricola, Nome) VALUES ('1231as','Marco')

questa query imposterà il sesso a "M"

perchè se carico la struttura del mio DB sempra con il file "Definizione Tabelle" e poi faccio la seguente query in MySQL:

DESCRIBE ESAMI

per l'attributo CFU compare il valore di default '0' (zero) pur non avendolo settato in fase di definizione tabelle? Lo stesso accade anche in altre tabelle

Perché per tutti i tipi di dati esistono dei valori di default impliciti, autonomamante assegnati da MySQL, che vengono utilizzati ad esempio in una insert che non specifica il valore di un attributo. Morale della favola: se non metti il valore di default per un attributo. MySQL lo assegna al posto tuo, usando un comportamento standard (gli interi a 0, i varchar a stringa vuota, le date a 0000-00-00, ecc.).

 :bye:

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