2013-05-14 6 views
7

Tôi đang cố chèn một bản ghi vào bảng dim_channel bằng 0 cho khóa chính (int không dấu).mysql không thể chèn bản ghi với khóa chính chưa được gán là số

Mysql lệnh:

INSERT INTO dim_channel 
set channel_id=0,name='Other',parent_channel_id=0,parent_channel_name='Other'; 

Kết quả:

select * from dim_channel; 
+------------+-------+-------------------+---------------------+ 
| channel_id | name | parent_channel_id | parent_channel_name | 
+------------+-------+-------------------+---------------------+ 
|   1 | Other |     0 | Other    | 
+------------+-------+-------------------+---------------------+ 

Xin lưu ý rằng channel_id có giá trị 1, không phải 0 như tôi mong đợi.

Bất kỳ ai biết tại sao điều này xảy ra.

Nhân tiện, tôi có thể cập nhật bản ghi dưới dạng: cập nhật kênh dim_channel channel_id = 0 trong đó channel_id = 1;

Chỉ muốn biết tại sao tôi không thể chèn bản ghi với channel_id = 0 ở địa điểm đầu tiên.

Cảm ơn rất nhiều.

====== lệnh MySQL để bạn có thể kiểm tra ====

- Tạo bảng

CREATE TABLE `dim_channel` (
    `channel_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` char(80) DEFAULT NULL, 
    `parent_channel_id` int(10) unsigned NOT NULL DEFAULT '0', 
    `parent_channel_name` varchar(80) DEFAULT NULL, 
    PRIMARY KEY (`channel_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

- chèn bản ghi

INSERT INTO dim_channel set channel_id=0,name='Other',parent_channel_id=0,parent_channel_name='Other'; 

- xem kết quả

select * from dim_channel; 
+0

mysql giả định 0 có nghĩa là "cung cấp cho tôi ID tiếp theo" cho cột auto_increment. Nếu bạn thực sự thực sự muốn một 0 nơi nó không thuộc về, sau đó sử dụng một bản cập nhật sau khi chèn. –

Trả lời

6

Đó là vì bạn có tự động tăng khóa chính trên trường đó. Nếu bạn chỉ định NULL hoặc 0 cho giá trị đó khi chèn, nó sẽ cung cấp cho bạn số tiếp theo theo thứ tự cho bảng.

+0

Cảm ơn. Dường như tôi phải sử dụng hai lệnh mysql để chèn bản ghi này. – user1828513

+0

@ user1828513 Lưu ý rằng nếu ý định của bạn là có thể nhập '0' làm giá trị cho nhiều bản ghi, bạn sẽ không thể có một khóa chính hoặc chỉ số duy nhất không null trên trường này. Tôi chắc chắn sẽ suy nghĩ về lý do tại sao bạn làm điều này ngay từ đầu và suy nghĩ xem liệu việc thiết lập giá trị trường khóa chính tăng tự động thành 0 có thực sự là cách tiếp cận tốt nhất để đại diện cho bất kỳ điều gì bạn đang cố gắng trình bày trong dữ liệu của mình hay không. –

+0

@MikeBrant hy vọng anh ấy không muốn chèn 0 vào nhiều hàng, làm như vậy HOÀN TOÀN sẽ phá vỡ khái niệm về 'id' – Felype

25

Tôi biết đây là một bài cũ nhưng dù sao đi nữa:

Sử dụng:

SET sql_mode='NO_AUTO_VALUE_ON_ZERO'; 

trước khi chèn giá trị 0 trong Kích thước của bạn.

+0

Lifesaver! Đây thực sự là câu trả lời đúng. –