web-dev-qa-db-ja.com

列COLUMN NAMEのこのMySQLエラーの不正な列指定子の取得を回避するにはどうすればよいですか?

このMySQLエラーが発生しないようにするにはどうすればよいですか?列topic_idの列指定子が正しくありません

MySQLエラー...

#1063 - Incorrect column specifier for column 'topic_id'

SQLスキーマ...

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;
28
JasonDavis

AUTO_INCREMENTを使用するには、INTではなく、CHARまたは浮動小数点型として列を定義する必要があります。

AUTO_INCREMENTは符号なしの値のみを使用するため、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;
39
M.Svrcek

auto_incrementプロパティは、数値列(整数および浮動小数点)でのみ機能し、char列では機能しません。

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;
5
Mureinik

doc の引用:

一部の属性はすべてのデータ型に適用されるわけではありません。 _AUTO_INCREMENT_は、整数型および浮動小数点型にのみ適用されます。 DEFAULTは、BLOBまたはTEXTタイプには適用されません。

あなたのケースでは、char列に_AUTO_INCREMENT_修飾子を適用しようとしています。これを解決するには、_AUTO_INCREMENT_を完全にドロップする(つまり、アプリケーションレベルで一意のIDを生成する必要がある)か、単に_topic_id_タイプを関連する整数に変更します。

補足として、char(36)を使用して投稿countを保存することはほとんど意味がないため、おそらく列のタイプも変更する必要があります。整数オーバーフローを防ぐためにこの方法を使用しているように見えますが、単一のトピックで_18446744073709551615_投稿(_BIGINT UNSIGNED_列に保存できる最大数)を超える投稿を処理している場合、おそらくあなたの側にはるかに大きな問題があります。 )

3
raina77ow

私は同じ問題を抱えていましたが、ロングタイプを使用していました。 INTに変更しましたが、うまくいきました。

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

char値を自動インクリメントすることはできません。 intまたはlong(整数または浮動小数点)でなければなりません。これで試してみて、

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;

お役に立てれば

2
codebot