2014-10-01 11 views
14

Làm cách nào để tránh bị lỗi MySQL này Trình chỉ định cột không chính xác cho cột topic_id?Làm thế nào tôi có thể tránh được lỗi MySQL này Trình chỉ định cột không chính xác cho cột COLUMN NAME?

MySQL Lỗi ...

#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; 

Trả lời

26

Để sử dụng AUTO_INCREMENT bạn cần phải deifne cột như INT hoặc dấu chấm động loại, không CHAR.

AUTO_INCREMENT chỉ sử dụng giá trị chưa được ký, vì vậy cũng tốt khi sử dụng 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

Có lẽ tôi đang lười biếng nhưng là có một cách 1-2 câu dễ dàng để xác định sự khác biệt trong điều khoản giả với 'UNSIGNED' và' SIGNED' Tôi không biết điều đó có nghĩa là gì và tôi không có thời gian để đọc trong một giờ ngay bây giờ? – JasonDavis

+2

Vâng, khi bạn định nghĩa INT cổ điển, nó được ký, giá trị từ -2147483648 đến 2147483647, nhưng giá trị tự động có thể chỉ cộng với chữ ký, vì vậy khi bạn sử dụng unsigned, mysql mong đợi các số từ 0 đến 4294967295, con trai giống nhau, INT là 4kb và trong cùng 4kb, bạn có thể sử dụng nhiều hơn hai lần mục :) hy vọng bạn hiểu –

2

Trích dẫn các doc:

Một số thuộc tính không áp dụng cho tất cả các loại dữ liệu. AUTO_INCREMENT chỉ áp dụng cho các loại số nguyên và dấu phẩy động. DEFAULT không áp dụng cho các loại BLOB hoặc TEXT.

Trong trường hợp của bạn, bạn đang cố gắng áp dụng AUTO_INCREMENT công cụ sửa đổi thành char cột. Để giải quyết điều này, hãy xóa hoàn toàn AUTO_INCREMENT (điều đó có nghĩa là bạn sẽ phải tạo một id duy nhất ở cấp ứng dụng) hoặc chỉ thay đổi loại topic_id thành số nguyên có liên quan.

Là một sidenote, nó có ý nghĩa ít khi sử dụng char(36) để lưu trữ các bài viết đếm, do đó, loại cột có thể phải được thay đổi là tốt. Dường như bạn đang đi theo cách này để ngăn chặn tràn số nguyên - nhưng nếu bạn đang xử lý nhiều hơn 18446744073709551615 bài đăng (số lớn nhất có thể được lưu trữ trong cột BIGINT UNSIGNED) trong một chủ đề, bạn có vấn đề lớn hơn về phía bạn có lẽ.)

+0

Tôi biết điều đó! Vâng, tôi nghĩ rằng có thể là vấn đề nhưng lướt qua các tài liệu tôi bỏ lỡ này, cảm ơn cho chỉ nó ra trong Docs quá – JasonDavis

5

Thuộc tính auto_increment chỉ hoạt động đối với các cột số (số nguyên và dấu chấm động), không char cột:

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

Bạn không thể tự động tăng giá trị char. Nó phải là int hoặc long (số nguyên hoặc dấu phẩy động). Hãy thử với điều này,

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; 

Hope this helps

+0

int (36)? trơi ơi không! : D –

+0

Đó là một sai lầm. Cảm ơn bạn M.Svrcek – codebot

2

Tôi đã gặp vấn đề tương tự, nhưng sử dụng loại Long. Tôi đã thay đổi cho INT và nó làm việc cho tôi.

CREATE TABLE lists (
id INT NOT NULL AUTO_INCREMENT, 
desc varchar(30), 
owner varchar(20), 
visibility boolean, 
PRIMARY KEY (id) 
); 
Các vấn đề liên quan