Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Errore query SQL

  1. #1
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319

    Errore query SQL

    Salve,

    ho Winxp e ho installato
    Apache(ver. 1.3.27) + Php 4(ver. 4.2.3)
    + Mysql(ver. 4.0.15) + PhpMyAdmin(ver. 2.5.3).

    Quando eseguo la seguente query in phpmyadmin

    CREATE TABLE `tipologia` (
    `codice` set('A','B','C','D','E') NOT NULL default '',
    `descrizione` varchar(50) default NULL,
    PRIMARY KEY (`codice`)
    ) TYPE=InnoDB;
    CREATE TABLE `paziente` (
    `codicefiscale` varchar(16) NOT NULL default '',
    `nome` varchar(20) NOT NULL default '',
    `cognome` varchar(20) NOT NULL default '',
    `eta` smallint(1) unsigned default NULL,
    `indirizzo` varchar(50) NOT NULL default '',
    `telefono` varchar(15) default NULL,
    `codicetipologia` set('A','B','C','D','E') NOT NULL default '',
    PRIMARY KEY (`codicefiscale`),
    FOREIGN KEY (`codicetipologia`) REFERENCES `tipologia` (`codice`) ON DELETE CASCADE ON UPDATE CASCADE
    ) TYPE=InnoDB;

    phpmyadmin mi restituisce questo messaggio di errore:

    Errore

    query SQL :

    CREATE TABLE `paziente` (
    `codicefiscale` varchar( 16 ) NOT NULL default '',
    `nome` varchar( 20 ) NOT NULL default '',
    `cognome` varchar( 20 ) NOT NULL default '',
    `eta` smallint( 1 ) unsigned default NULL ,
    `indirizzo` varchar( 50 ) NOT NULL default '',
    `telefono` varchar( 15 ) default NULL ,
    `codicetipologia` set( 'A', 'B', 'C', 'D', 'E' ) NOT NULL default '',
    PRIMARY KEY ( `codicefiscale` ) ,
    FOREIGN KEY ( `codicetipologia` ) REFERENCES `tipologia` ( `codice` ) ON DELETE CASCADE ON UPDATE CASCADE
    ) TYPE = InnoDB

    Messaggio di MySQL:

    #1005 - Can't create table '.\ttt\paziente.frm' (errno: 150)


    Se non metto la riga "FOREIGN KEY ( `codicetipologia` ) REFERENCES `tipologia` ( `codice` ) ON DELETE CASCADE ON UPDATE CASCADE"
    tutto funziona bene.
    Perchè mi da quel messaggio dal momento che la tabella referenziata è stata già dichiarata prima?

  2. #2
    Ciao inc40,
    quando crei una chiave esterna in MySQL devi assicurarti che entrambi i campi da collegare abbiano un indice.

    Prova così:
    CREATE TABLE `tipologia` (
    `codice` set('A','B','C','D','E') NOT NULL default '',
    `descrizione` varchar(50) default NULL,
    PRIMARY KEY (`codice`)
    ) TYPE=InnoDB;

    CREATE TABLE `paziente` (
    `codicefiscale` varchar(16) NOT NULL default '',
    `nome` varchar(20) NOT NULL default '',
    `cognome` varchar(20) NOT NULL default '',
    `eta` smallint(1) unsigned default NULL,
    `indirizzo` varchar(50) NOT NULL default '',
    `telefono` varchar(15) default NULL,
    `codicetipologia` set('A','B','C','D','E') NOT NULL default '',
    PRIMARY KEY (`codicefiscale`),
    KEY `codicetipologia` (`codicetipologia`),
    CONSTRAINT `paziente_ibfk_1` FOREIGN KEY (`codicetipologia`) REFERENCES `tipologia` (`codice`) ON DELETE CASCADE ON UPDATE CASCADE
    ) TYPE=InnoDB;
    ho aggiunto "KEY `codicetipologia` (`codicetipologia`)"


  3. #3
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    [supersaibal]Originariamente inviato da Gianni_T
    Ciao inc40,
    quando crei una chiave esterna in MySQL devi assicurarti che entrambi i campi da collegare abbiano un indice.

    Prova così: ...
    ho aggiunto "KEY `codicetipologia` (`codicetipologia`)"

    [/supersaibal]
    Grazie Gianni_T. Però non riesco proprio a capire come sia possibile che queste 2 query vengano eseguite:

    Query 1
    CREATE TABLE `tipologia` (
    `codice` set('A','B','C','D','E') NOT NULL default '',
    `descrizione` varchar(50) default NULL,
    PRIMARY KEY (`codice`)
    ) TYPE=InnoDB;
    CREATE TABLE `paziente` (
    `codicefiscale` varchar(16) NOT NULL default '',
    `nome` varchar(20) NOT NULL default '',
    `cognome` varchar(20) NOT NULL default '',
    `eta` smallint(1) unsigned default NULL,
    `indirizzo` varchar(50) NOT NULL default '',
    `telefono` varchar(15) default NULL,
    `codicetipologia` set('A','B','C','D','E') NOT NULL default '',
    PRIMARY KEY (`codicefiscale`),
    KEY `codicetipologia` (`codicetipologia`),
    FOREIGN KEY (`codicetipologia`) REFERENCES `tipologia` (`codice`) ON DELETE CASCADE ON UPDATE CASCADE
    ) TYPE=InnoDB;


    Query 2
    CREATE TABLE sede (
    cod_s int(11) unsigned NOT NULL auto_increment,
    nome varchar(20) NOT NULL default '',
    indirizzo varchar(50) NOT NULL default '',
    tel varchar(15) default NULL,
    fax varchar(15) default NULL,
    email varchar(30) default NULL,
    tipo set('Centrale','Filiale') NOT NULL default 'Filiale',
    PRIMARY KEY (cod_s)
    ) TYPE=InnoDB;
    CREATE TABLE cliente (
    cod_c int(11) unsigned NOT NULL auto_increment,
    nome varchar(20) NOT NULL default '',
    cognome varchar(20) NOT NULL default '',
    sesso set('M','F') NOT NULL default 'M',
    indirizzo varchar(50) NOT NULL default '',
    codfisc varchar(16) NOT NULL default '',
    cell varchar(12) default NULL,
    casa varchar(12) default NULL,
    sede int(11) unsigned default NULL,
    PRIMARY KEY (cod_c),
    KEY sede (sede),
    FOREIGN KEY (`sede`) REFERENCES `sede` (`cod_s`) ON DELETE SET NULL
    ) TYPE=InnoDB;


    e invece questa, che è quasi uguale alla Query 1, non viene eseguita:

    Query con errore
    CREATE TABLE `ente` (
    `codice` int(11) unsigned NOT NULL default '0',
    PRIMARY KEY (`codice`)
    ) TYPE=InnoDB;
    CREATE TABLE `medico` (
    `cui` int(11) unsigned NOT NULL default '0',
    `nome` varchar(20) NOT NULL default '',
    `cognome` varchar(20) NOT NULL default '',
    `eta` smallint(1) unsigned default NULL,
    `indirizzo` varchar(50) NOT NULL default '',
    `telefono` varchar(15) default NULL,
    `codicefiscale` varchar(16) NOT NULL default '',
    `codiceente` int(11) unsigned default NULL,
    `percentuale` smallint(1) unsigned default NULL,
    PRIMARY KEY (`cui`),
    KEY `codiceente` (`codiceente`),
    FOREIGN KEY (`cui`) REFERENCES `login` (`cui`) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (`codiceente`) REFERENCES `ente` (`codice`) ON DELETE SET NULL ON UPDATE CASCADE
    ) TYPE=InnoDB;

    ma phpmyadmin mi restituisce il seguente messaggio di errore:

    Errore

    query SQL :

    CREATE TABLE `medico` (

    `cui` int( 11 ) unsigned NOT NULL default '0',
    `nome` varchar( 20 ) NOT NULL default '',
    `cognome` varchar( 20 ) NOT NULL default '',
    `eta` smallint( 1 ) unsigned default NULL ,
    `indirizzo` varchar( 50 ) NOT NULL default '',
    `telefono` varchar( 15 ) default NULL ,
    `codicefiscale` varchar( 16 ) NOT NULL default '',
    `codiceente` int( 11 ) unsigned default NULL ,
    `percentuale` smallint( 1 ) unsigned default NULL ,
    PRIMARY KEY ( `cui` ) ,
    KEY `codiceente` ( `codiceente` ) ,
    FOREIGN KEY ( `cui` ) REFERENCES `login` ( `cui` ) ON DELETE CASCADE ON UPDATE CASCADE ,
    FOREIGN KEY ( `codiceente` ) REFERENCES `ente` ( `codice` ) ON DELETE SET NULL ON UPDATE CASCADE
    ) TYPE = InnoDB

    Messaggio di MySQL:


    #1005 - Can't create table '.\prova\medico.frm' (errno: 150)
    [Documentazione] · [Indietro]

    Come è possibile

  4. #4
    ma la tabella login dov'e'?

    :master:

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    il problema è sempre sugli indici: quando una tabella si collega ad un'altra i campi che vengono collegati devono avere un indice. Ti ricordo che una chiave primaria è intrinsecamente indicizzata, non necessita la creazione esplicita di un indice. Quindi se colleghi due tabelle usando un campo esterno che è gia chiave primaria non hai bisogno di creare nuovi indici (perché già ci sono).

  6. #6
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Scusate se disturbo ancora...questa dovrebbe essere l'utima domanda (spero!):
    perché phpmyadmin alla seguente query

    codice:
    CREATE TABLE `tipologia` (
      `codice` set('A','B','C','D','E') NOT NULL default '',
      `descrizione` varchar(50) default NULL,
      PRIMARY KEY  (`codice`)
    ) TYPE=InnoDB;
    CREATE TABLE `paziente` (
      `codicefiscale` varchar(16) NOT NULL default '',
      `nome` varchar(20) NOT NULL default '',
      `cognome` varchar(20) NOT NULL default '',
      `eta` smallint(1) unsigned default NULL,
      `indirizzo` varchar(50) NOT NULL default '',
      `telefono` varchar(15) default NULL,
      `codicetipologia` set('A','B','C','D','E') NOT NULL default 'E',
      PRIMARY KEY  (`codicefiscale`),
      KEY `codicetipologia` (`codicetipologia`),
      CONSTRAINT `0_5` FOREIGN KEY (`codicetipologia`) REFERENCES `tipologia` (`codice`) ON DELETE SET default ON UPDATE CASCADE
    ) TYPE=InnoDB;
    mi restituisce questo messaggio di errore?

    codice:
    Errore
    
    query SQL :  
    
    CREATE TABLE `paziente` (
      `codicefiscale` varchar( 16 ) NOT NULL default '',
      `nome` varchar( 20 ) NOT NULL default '',
      `cognome` varchar( 20 ) NOT NULL default '',
      `eta` smallint( 1 ) unsigned default NULL ,
      `indirizzo` varchar( 50 ) NOT NULL default '',
      `telefono` varchar( 15 ) default NULL ,
      `codicetipologia` set( 'A', 'B', 'C', 'D', 'E' ) NOT NULL  default 'E',
      PRIMARY KEY ( `codicefiscale` ) ,
      KEY `codicetipologia` ( `codicetipologia` ) ,
      CONSTRAINT `0_5` FOREIGN KEY ( `codicetipologia` ) REFERENCES tipologia` ( `codice` ) ON DELETE SET default ON UPDATE CASCADE 
    ) TYPE = InnoDB 
    
    Messaggio di MySQL: 
    
    #1005 - Can't create table '.\prova\paziente.frm' (errno: 150)
    Ho notato che se in CONSTRAINT `0_5`.... al posto di "ON DELETE SET default" metto "ON DELETE CASCADE" tutto funziona correttamente. Ma a me "SET CASCADE", ovviamente, non va bene.

    E poi, qual è la sintassi corretta per assegnare un determinato valore in una clausola tipo "ON DELETE"?

    Grazie, e grazie anche per le precedenti risposte.

  7. #7

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.