2011-11-03 64 views
8

Vì vậy, khi cố gắng thêm tự động vào trường nó đi kèm với # 1062 - Mục nhập trùng lặp '1' cho khóa 1. Tôi đã thử loại bỏ các khóa chính và tái bổ sung nó và hoạt động tốt (mà tôi giả định sẽ không nếu có bản sao?)# 1062 - Mục nhập trùng lặp '1' cho khóa 1 - Không có mục trùng lặp nào được tìm thấy

Nhưng khi tôi cố gắng thêm một autoincrement cho trường nó ném một lỗi. Nó cung cấp cho tôi một tùy chọn duyệt chạy SQL sau đây:

SELECT * 
FROM `myTbl` 
WHERE CONCAT_WS("-", 11) = "1" 
ORDER BY 11 
LIMIT 0 , 30 

Tuy nhiên, điều này trả về kết quả trống .. cho thấy không có trùng lặp. Vì vậy, nếu không có bản sao, làm thế nào đến tôi không thể thêm một autoincrement?

+0

Bạn mong đợi kết quả của 'CONCAT_WS (" - ", 11)' là gì? Tôi luôn luôn nhận được 11 ở đó ... – glglgl

+0

Vui lòng đăng kết quả của 'SHOW CREATE TABLE myTbl' và lệnh bạn sử dụng để thêm tự động. Cũng lưu ý rằng 'CONCAT_WS ('-', 11) = '1'' sẽ luôn luôn đánh giá là' FALSE'. Bạn không thể sử dụng thứ tự của trường trong mệnh đề 'WHERE' theo cách bạn làm trong' ORDER BY'. – Quassnoi

+0

Vì vậy, bạn không nghĩ rằng tôi ditzy, tôi đã không viết rằng SQL - nó đã được tạo ra bởi phpMyAdmin khi nhấn nút duyệt sau khi nó tạo ra lỗi. Tôi nghĩ rằng áp phích dưới đây (Michael Mior) là đúng và bây giờ tôi đang thử giải pháp đó. – Ashley

Trả lời

20

Bạn có bất kỳ hàng nào có giá trị 0 hoặc NULL cho cột này không? ALTER TABLE có thể làm cho các khóa chính được đặt lại. Trong trường hợp khóa 0, MySQL sẽ cố gắng cung cấp cho nó giá trị 1, sẽ thất bại nếu khóa 1 đã tồn tại.

Thử thay đổi bất kỳ giá trị 0 hoặc NULL nào trong cột thành cột nào đó cao hơn (và không sử dụng).

+0

@Micheal, điều gì sẽ xảy ra nếu bạn cố gắng chèn 0 vào PK phụ thuộc vào chế độ SQL MySQL. Nếu nó ở chế độ thư giãn cũ, nó sẽ không thay thế 1, nhưng cho phép tăng tự động tiếp theo. Nếu ở chế độ nghiêm ngặt được đề xuất, nó sẽ chèn '0'. – Johan

+0

@Johan Điểm tốt. Tuy nhiên, tôi vẫn nghi ngờ điều này sẽ giải quyết được vấn đề. –

+0

Điều này làm việc - có 0 trong đó; cảm ơn! – Ashley

0
SELECT *       <<-- Select * is an anti-pattern 
FROM myTbl 
WHERE CONCAT_WS("-", 11) = "1" <<-- You are not selecting a column 
ORDER BY 11      <<-- This however does refer to a column. 
LIMIT 30 OFFSET 0 

viết lại truy vấn để

SELECT field1, field2, field3, ...., field11 
FROM myTbl 
WHERE COALESCE(field1, field2, field3, field11) = '1' 
ORDER BY field11    
LIMIT 30 OFFSET 0 

Nếu bạn muốn chèn một mã sử dụng hàng như thế này:

INSERT INTO table1 (/*do not list the PK!*/ field2, field3, field4) 
    VALUES ('a', 'test' ,'b' ,'example'); 

Nếu bạn muốn chọn tất cả các hàng trùng lặp sử dụng:

SELECT id, count(*) as duplicate_count 
FROM table1 
GROUP BY id 
HAVING duplicate_count > 1 

Bạn sẽ cần cập nhật các id đó được liệt kê là trùng lặp.

Tùy chọn khác là thêm cột phụ và xóa PK cũ.

ALTER TABLE table1 ADD COLUMN new_id unsigned integer not null auto_increment primary key; 
ALTER TABLE table1 DROP COLUMN id; 
ALTER TABLE table1 CHANGE COLUMN newid id; 
+0

Trừ khi tôi hiểu lầm, vấn đề là OP không thể thêm 'AUTO_INCREMENT' vào một cột. Tôi không thấy cách giải quyết vấn đề này. –

2

Câu trả lời của Michael Mior hoạt động nếu bạn có thể thay đổi dữ liệu trong bảng. Tuy nhiên, cũng có một giải pháp thay thế cho phép bạn giữ nguyên dữ liệu (tôi đã thử nghiệm điều này trên MySQL 5.5). Hãy nhớ rằng có một giá trị bằng không như một khóa chính trong MySQL không phải là một thực hành được khuyến cáo chỉ vì lý do này. Nếu bạn có thể thoát khỏi số không, sau đó làm điều đó.

Disable hệ giá trị tự động khi một số không được chèn:

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; 

Thêm AUTO_INCREMENT để cột của bạn:

ALTER TABLE ... AUTO_INCREMENT; 

Kích hoạt lại hệ giá trị tự động:

SET SQL_MODE=''; 

Nó nên rõ ràng là việc chèn dữ liệu vào bảng trong toàn bộ thao tác này không thể được phép. Nếu không, sẽ có các giá trị không mong muốn trong cột.

Các vấn đề liên quan