Leggere da file

Salve, qualcuno mi spiegare come posso fare a caricare in MySQL, tutte le definizioni delle tabelle che compongono il mio DataBase,scritte precedentemente su un file di testo? Il file da caricare deve essere salvato in formato ".txt" oppure ".sql" oppure ".SQL"?? Inoltre una volta caricate tutte le tabelle,e quindi costrutito la struttura del database,come faccio a popolare (riempire) le tabelle? Il file da cui andrò a leggere i dati, come deve essere salvato? Deve essere costruito un file per ogni tabella?

GRAZIE ANTICIPATAMENTE

inviato 11 anni fa
noems
X 0 X

Sia la creazione delle tabelle, sia l'inserimento dei dati sono operazioni che si possono realizzare in diversi modi.

Se hai a diposizione l'SQL ovvero delle query per creare (con delle "CREATE TABLE ...") e popolare (con delle "INSERT INTO ...") il database allora devi mettere tutto su un file di testo e darlo in pasto a MySQL. Non importa l'estensione che darai al file.

Per eseguire questa operazione puoi usare qualche programma adeguato, ad esempio phpMyAdmin che ha proprio una funzione che permette di inviare un file contenente delle query affinché vengano eseguite nel DB.

Oppure, sempre con un programma adeguato, puoi costruire e popolare le tabelle seguendo delle semplici procedure, senza usare direttamente l'SQL. Anche in questo caso phpMyAdmin va bene.

Dimmi a quale tecnica sei più interessato e ti fornirò maggiori dettagli.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni,

premetto che ho installato tutto il pacchetto seguendo le vostre istruzioni e tutto è andato alla meraviglia al primo colpo o quasi (ho cambiato il path, invece di essere C:\Php il mio è diventato C:\Programmi PHP 5).Il pacchetto comprende:

1) MySQL 4.1,

2) Apache Server 2.0.52

3) Php 5

Veniamo al dunque:

Il mio problema è quello di non voler riscrivere la struttura del database (mi riferisco alle istruzioni CREATE DATABASE PIANI_DI_STUDIO, CREATE TABLE STUDENTI (definizione dati) ecc. Cioè vorrei poter leggere da file queste cose senza dover riscrivere nulla quando il mio professore andrà a correggere il mio progetto; inoltre una volta creata la struttura vorrei sapere come devo fare a popolare le varie tabelle che compongono il mio database (questo è un progetto che stiamo facendo all'Università per il corso di "Basi di Dati e Sistemi Informativi" della facoltà di Napoli).

Ho provato ad usare LOAD DATA INFILE ma questo comando serve solo a popolare una tabella.

Le mie domande sono

1) Come devono essere salvati i 2 file (se devono essere 2 nn lo so, uno per la struttua del db e l'altra per popolare le tabelle)

2) Bisogna creare un file per ogni tabella, per poterle popoalre tutte da file?

Poi ho anche altre domande,

questo è solo un'assaggio.

Ciao e GRAZIE MILLE!!

risposto 11 anni fa
noems
X 0 X

Basta un unico file con tutte le query dentro, separate da un punto e virgola. Metti le query  per creare le tabelle e per inserire i dati.

Ti consiglio di installarti il phpMyAdmin, è un programma scritto in PHP che permette di gestire MySQL. Tra le tante funzionalitò ti permette di eseguire tutte le query presenti in un file.

Le istruzioni per installare phpMyAdmin le trovi qui:

http://www.phpnews.it/content/view/117/80/

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

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)

CREATE TABLE PIANI

(

 Mat CHAR(10) NOT NULL,

 Cod_P INT UNSIGNED NOT NULL,

 Cod_Esami CHAR(3) NOT NULL,

 Anno SMALLINT(1) NOT NULL,

 Data DATE,

 Voto SMALLINT(2) DEFAULT 'NULL',

 Lode CHAR(1) DEFAULT 'N',

 PRIMARY KEY (Mat,Cod_P,Cod_Esami),

 FOREIGN KEY (Mat) REFERENCES STUDENTI(Matricola)

  ON DELETE CASCADE

  ON UPDATE CASCADE,   

 FOREIGN KEY (Cod_Esami) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_P) REFERENCES STUDENTI(Cod_Piano)<--------

  ON DELETE CASCADE

  ON UPDATE CASCADE

);

Domanda: Il problema di questa query stà nelle ultime 3 righe (almeno credo), infatti se

         tolgo l'ultimo FOREIGN KEY,MySQL mi dà una risposta positiva, altrimenti, negativa.

         Come devo fare? Il problema si pone anche quando tolgo tutti i FOREIGN KEY

         e lascio solo quello che mi dà problemi.

         L'errore che si presenta è: ERROR 1005 (HY000): Can't create table '.\piani_di_studio\piani.frm (errno: 150)

         C'è una tabella in cui è possibile vedere il codice di errore che si presenta, a cosa equivale?

         Ho provato con il comando SHOW ERRORS ma mi risponde "EMPTY SET", come faccio?

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

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

         la clausola AUTO_INCREMENT per l'attibuto Cod_Piano, quindi,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)?

Domanda: Se in certe tabelle degli attirbuti sono stati dichiarati come chiave primaria, bisogna dichiararli

         ancora dichiararli come PRIMARY KEY, nelle tabelle che utilizzano  questi attributi

         (ad esempio vedi la PRIMARY KEY della abella PROPEDEUTICI)

Queste sono le altre definizioni, gli puoi dare un'occhiata per vedere se ci sono degli errori logici (sintatticamente funzionano tutte):

CREATE TABLE ESAMI

(Cod_Esame CHAR(3) NOT NULL,

 Titolo VARCHAR(30) NOT NULL,

 Contenuti TEXT(256) NOT NULL,

 Tipo_Attivita VARCHAR(8) NOT NULL,

 Prova_Fin CHAR(1) NOT NULL,

 CFU SMALLINT(2) NOT NULL,

 Tipo CHAR(1) NOT NULL DEFAULT 'O',

 PRIMARY KEY (Cod_Esame),

 CONSTRAINT Check_Prova_Fin CHECK (Prova_Fin IN (E,K,C)),

 CONSTRAINT Check_Tipo CHECK (Tipo IN (O,F))

);

CREATE TABLE ANNI

 (Cod_E CHAR(3) NOT NULL,

  Anno SMALLINT(1) NOT NULL,

  PRYMARY KEY (Cod_E,Anno),

  FOREIGN KEY (Cod_E) REFERENCES ESAMI(Cod_Esame)

    ON DELETE CASCADE

    ON UPDATE CASCADE,

  CONSTRAINT Check_Anno (Anno IN (1,2,3))

 );

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

 );

SPERO DI ESSERE STATO, CHIARO

GRAZIE MILLE DEGLI AIUTI DATI!

risposto 11 anni fa
noems
X 0 X

Stiamo uscendo fuori tema  :knuppel: (Regola 8)

Ti prego di aprire una discussione appropriata (con un titolo adeguato) per ogni argomento. Ciò renderà il forum più facile da consultare per gli altri utenti.

Grazie.  :bye:

risposto 11 anni fa
Gianni Tomasicchio
modificato 11 anni fa
X 0 X

Purtoppo i problemi sono tanti, e per di più correlati frà di loro, ecco perchè ho dovuto presentare tutto o parte del codice;

C'è una domanda però che è la seguente:

Se creo un database e le relative tabelle, e poi faccio il dump della struttura con phpmyadmin mi viene restituito un file (che può avere un nome a scelta) che contiene l'intera struttura del database; Come mai se cancello tutto il database tramite MySQL(e di conseguenze le relative tabelle) e poi, tramite phpmyadmin, carico il file appena restituito (per nn vover ridigitare il tutto in MySQL) mi viene restituito un errore (se nn sbaglio il 150) che mi informa che nn è possbile creare le tabelle del database (Cant' create ecc.)

GRAZIE

risposto 11 anni fa
noems
X 0 X

Così è difficile fare delle ipotesi, riporta per intero il messaggio di errore.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

La situazione è la seguente:

1) E' stato creato un db con nome piani_di_studio e sono state inserite le tabelle al suo interno (con qualche errore, come giustamente mi hai segnalato tu,mi riferisco ai constraint,engine ecc...).

2) Con phpmyadmin ho fatto il dump della struttura del db piani_di_studio ottenendo il seguente file denominato piani_di_studio (con molta fantasia...):

# phpMyAdmin MySQL-Dump

# version 2.2.1

# http://phpwizard.net/phpMyAdmin/

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

#

# Host: localhost

# Generato il: 20 Set, 2005 at 10:23 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 smallint(1) NOT NULL default '0',

  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 char(1) NOT NULL default '',

  CFU smallint(1) NOT NULL default '0',

  Tipo char(1) 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 smallint(1) NOT NULL default '0',

  `Data` date default NULL,

  Voto smallint(2) default '0',

  Lode char(1) 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 char(1) NOT NULL default '',

  PRIMARY KEY  (Matricola),

  UNIQUE KEY Cod_Piano (Cod_Piano)

) ENGINE=InnoDB ;

3) Ho dato in pasto a phpmyadmin lo stesso file per creare la struttura di un nuovo db piani_di_studio2, giusto per fare una prova e l'errore che si presenta in phpmyadmin è il seguente:

Errore

query SQL : 

CREATE TABLE anni (

  Cod_E char(3) NOT NULL default '',

  Anno smallint(1) NOT NULL default '0',

  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

Messaggio di MySQL:

Can't create table '.\piani_di_studio2\anni.frm' (errno: 150)

Da notare che ENGINE=InnoDB e il resto è stato assegnato automaticamente,e non da me, quindi c'è lo stesso bisogno che lo dichiari?

risposto 11 anni fa
noems
X 0 X

Il fatto che ci sia già l'indicazione ENGINE=InnoDB significa che tali tabelle sono abilitate e in più sono quelle di default. Per ciò tutte le tabelle che non dichiarano il tipo diventano InnoDB.

L'errore che ottieni è causato da un semplice problema. La prima tabella che crei (anni) ha un vincolo di integrità referenziale verso una tabella che ancora non esiste (esami). Pertanto MySQL non può crearla. Questo capita perché phpMyAdmin ti ha esportato le tabelle in ordine alfabetico. Hai 2 modi per risolvere il problema:

1) riordini le query di creazione delle tabelle in modo che nessuna tabella faccia riferimento a d altre che verranno create successivamente. Questa tecnica non è sempre fattibile (caso di riferimenti ciclici)

2) Metti all'inizio del dump la query SET FOREIGN_KEY_CHECKS=0; e alla fine SET FOREIGN_KEY_CHECKS=1;. In questo modo durante la creazione delle tabelle MySQL non controllerà i vincoli sulle chiavi primarie. phpMyAdmin è in grado di aggiungere queste query automaticamente ad un dump, basta spuntare l'opzione "Disabilita i controlli sulle chiavi straniere".

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Come mai nel file restituito da phpmyadmin dopo l'esecuzione del dump della struttura, compaiono dei defualt vicino agli attributi, pur non avendoli specificati in fase di definizione dei dati? Come ad esempio

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 char(1) NOT NULL default '', <----------------

  PRIMARY KEY  (Matricola),

  UNIQUE KEY Cod_Piano (Cod_Piano)

) ENGINE=InnoDB ;

GRAZIE MILLE PER OGNI RISPOSTA DATA

risposto 11 anni fa
noems
X 0 X

Quindi per evitare l'erorre (errno 150) basta che i file da cui caricare la struttura abbia un'aspetto simile:

# phpMyAdmin MySQL-Dump

# version 2.2.1

# http://phpwizard.net/phpMyAdmin/

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

#

# Host: localhost

# Generato il: 20 Set, 2005 at 10:23 PM

# Versione MySQL: 4.01.08

# Versione PHP: 5.0.5

# Database : `piani_di_studio`

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

#

# Struttura della tabella `anni`

#

SET FOREIGN_KEY_CHECKS=0    <--------------------------------

CREATE TABLE anni (

  Cod_E char(3) NOT NULL default '',

  Anno smallint(1) NOT NULL default '0',

  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( NOT NULL default '',

  Prova_Fin char(1) NOT NULL default '',

  CFU smallint(1) NOT NULL default '0',

  Tipo char(1) 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 smallint(1) NOT NULL default '0',

  `Data` date default NULL,

  Voto smallint(2) default '0',

  Lode char(1) 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 char(1) NOT NULL default '',

  PRIMARY KEY  (Matricola),

  UNIQUE KEY Cod_Piano (Cod_Piano)

) ENGINE=InnoDB ;

SET FOREIGN_KEY_CHECKS=1  <--------------------------

Senza cambiare l'ordine di definizione tabella,dovrebbe funzionare confermi?

GRAZIE MILLE PER OGNI RISPOSTA DATA

risposto 11 anni fa
noems
X 0 X
Come mai nel file restituito da phpmyadmin dopo l'esecuzione del dump della struttura, compaiono dei defualt vicino agli attributi, pur non avendoli specificati in fase di definizione dei dati?

Anche se non li specifichi espressamente MySQL deve comunque avere delle direttive di comportamento. Pertanto, in maniera arbistraria, assegna quelle impostazioni poiché sono necessarie al suo corretto funzionamento.

phpMyAdmin si limita a risportare tutto, poiché non sa se quelle impostazioni sono state decise dall'utente o autonomamante da MySQL (in realtà non è phpMyAdmin che crea il dump ma MySQL stesso...)

Quindi per evitare l'erorre (errno 150) basta che i file da cui caricare la struttura abbia un'aspetto simile:

...

Senza cambiare l'ordine di definizione tabella,dovrebbe funzionare confermi?

Si. Come ti ho detto prima puoi far inserire quelle query direttamente a phpMyAdmin all'atto della realizzazione del dump, senza che tu debba intervenire manualmente.

 :bye:

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