2014-10-01 20 views
14

Come evitare di ottenere questo errore MySQL Specificatore di colonna errato per la colonna topic_id?Come evitare di ottenere questo errore MySQL Specificatore di colonna errato per colonna COLUMN NAME?

MySQL errore ...

#1063 - Incorrect column specifier for column 'topic_id' 

SQL Schema ...

CREATE TABLE discussion_topics (
    topic_id char(36) NOT NULL AUTO_INCREMENT, 
    project_id char(36) NOT NULL, 
    topic_subject VARCHAR(255) NOT NULL, 
    topic_content TEXT default NULL, 
    date_created DATETIME NOT NULL, 
    date_last_post DATETIME NOT NULL, 
    created_by_user_id char(36) NOT NULL, 
    last_post_user_id char(36) NOT NULL, 
    posts_count char(36) default NULL, 
    PRIMARY KEY (topic_id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

risposta

26

da usare AUTO_INCREMENT è necessario deifne colonna come INT o in virgola mobile tipi, non CHAR.

AUTO_INCREMENT utilizzare solo valore senza segno, quindi è bene utilizzare anche UNSIGNED;

CREATE TABLE discussion_topics (

    topic_id INT NOT NULL unsigned AUTO_INCREMENT, 
    project_id char(36) NOT NULL, 
    topic_subject VARCHAR(255) NOT NULL, 
    topic_content TEXT default NULL, 
    date_created DATETIME NOT NULL, 
    date_last_post DATETIME NOT NULL, 
    created_by_user_id char(36) NOT NULL, 
    last_post_user_id char(36) NOT NULL, 
    posts_count char(36) default NULL, 
    PRIMARY KEY (topic_id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 
+0

Forse sono pigro, ma c'è un modo facile a 1-2 frasi per definire la differenza in termini fittizi per 'UNSIGNED' vs' SIGNED' non ho idea di cosa significhi sfortunatamente e non ho tempo di leggere per un'ora in questo momento? – JasonDavis

+2

Bene, quando si definisce INT classico, è firmato, valori da -2147483648 a 2147483647, ma i valori autoincementati possono essere solo più firmati, quindi quando si usa unsigned, mysql si aspetta numeri da 0 a 4294967295, figlio nello stesso, INT è 4kb e in quello stesso 4kb, puoi usare due volte più voci :) spero tu capisca –

2

Citando il doc:

Alcuni attributi non si applicano a tutti i tipi di dati. AUTO_INCREMENT applica solo a numeri interi e a virgola mobile. DEFAULT non si applica a i tipi BLOB o TEXT.

Nel tuo caso, si sta cercando di applicare AUTO_INCREMENT modificatore char colonna. Per risolvere questo problema, puoi eliminare AUTO_INCREMENT del tutto (ciò significa che dovrai generare un ID univoco a livello di applicazione) o semplicemente cambiare il tipo topic_id in quello intero rilevante.

Come sidenote, non ha molto senso utilizzare char(36) per memorizzare i messaggi conteggio, in modo che il tipo di colonna ha probabilmente essere cambiato pure. Sembra che tu stia andando in questo modo per evitare l'overflow dei numeri interi, ma se hai a che fare con più di 18446744073709551615 post (il numero più grande che può essere memorizzato nella colonna BIGINT UNSIGNED) in un singolo argomento, hai un problema molto più grande dalla tua parte probabilmente.)

+0

Lo sapevo! Beh, ho pensato che potesse essere il problema, ma sfiorare i documenti mi mancava, grazie per averlo fatto notare anche in Docs – JasonDavis

5

La struttura auto_increment funziona solo per le colonne numeriche (interi e virgola mobile), non char colonne:

CREATE TABLE discussion_topics (
    topic_id INT NOT NULL AUTO_INCREMENT, 
    project_id char(36) NOT NULL, 
    topic_subject VARCHAR(255) NOT NULL, 
    topic_content TEXT default NULL, 
    date_created DATETIME NOT NULL, 
    date_last_post DATETIME NOT NULL, 
    created_by_user_id char(36) NOT NULL, 
    last_post_user_id char(36) NOT NULL, 
    posts_count char(36) default NULL, 
    PRIMARY KEY (topic_id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 
2

Non è possibile aumentare automaticamente i valori char. Dovrebbe essere int o long (numeri interi o punti mobili). prova con questo,

CREATE TABLE discussion_topics (
    topic_id int(5) NOT NULL AUTO_INCREMENT, 
    project_id char(36) NOT NULL, 
    topic_subject VARCHAR(255) NOT NULL, 
    topic_content TEXT default NULL, 
    date_created DATETIME NOT NULL, 
    date_last_post DATETIME NOT NULL, 
    created_by_user_id char(36) NOT NULL, 
    last_post_user_id char(36) NOT NULL, 
    posts_count char(36) default NULL, 
    PRIMARY KEY (`topic_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

Spero che questo aiuti

+0

int (36)? diavolo, no! : D –

+0

Questo è stato un errore. Grazie M.Svrcek – codebot

2

ho avuto lo stesso problema, ma usando il tipo Long. Ho cambiato per INT e ha funzionato per me.

CREATE TABLE lists (
id INT NOT NULL AUTO_INCREMENT, 
desc varchar(30), 
owner varchar(20), 
visibility boolean, 
PRIMARY KEY (id) 
); 
Problemi correlati