2013-08-05 34 views
136

Tôi nhận được lỗi 1022 liên quan đến các phím trùng lặp khi tạo lệnh bảng. Sau khi xem xét truy vấn, tôi không thể hiểu nơi xảy ra sự trùng lặp. Có ai khác nhìn thấy nó không?Lỗi 1022 - Không thể viết; khoá trùng lặp trong bảng

SQL query: 

-- ----------------------------------------------------- 
-- Table `apptwo`.`usercircle` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `apptwo`.`usercircle` (

`idUserCircle` MEDIUMINT NOT NULL , 
`userId` MEDIUMINT NULL , 
`circleId` MEDIUMINT NULL , 
`authUser` BINARY NULL , 
`authOwner` BINARY NULL , 
`startDate` DATETIME NULL , 
`endDate` DATETIME NULL , 
PRIMARY KEY ( `idUserCircle`) , 
INDEX `iduser_idx` ( `userId` ASC) , 
INDEX `idcategory_idx` ( `circleId` ASC) , 
CONSTRAINT `iduser` FOREIGN KEY ( `userId`) REFERENCES `apptwo`.`user` (
`idUser` 
) ON DELETE NO ACTION ON UPDATE NO ACTION , 
CONSTRAINT `idcategory` FOREIGN KEY ( `circleId`) REFERENCES `apptwo`.`circle` (
`idCircle` 
) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE = INNODB; 

MySQL said: Documentation 

#1022 - Can't write; duplicate key in table 'usercircle' 
+4

Nếu tôi nhớ chính xác, khóa chính luôn là một chỉ số UNIQUE, vì vậy bạn sẽ phải hủy câu lệnh chỉ mục duy nhất? – Mr47

+0

Cảm ơn lời khuyên! –

+0

Bất kỳ ai khác nhìn thấy bất kỳ vấn đề nào với truy vấn? –

Trả lời

328

Các khả năng bạn đã có một hạn chế với tên iduser hoặc idcategory trong cơ sở dữ liệu của bạn nhất. Chỉ cần đổi tên các ràng buộc nếu có.

+11

Chính xác như bạn đã nói. Nhiều ràng buộc được tạo tự động với cùng tên idcategory iduser trong phần còn lại của truy vấn CREATE - cảm ơn sự giúp đỡ của bạn! –

+0

Tôi nghĩ rằng MySQL Workbench có thể đã sửa lỗi này khi xuất khẩu kịch bản sáng tạo, nhưng đó là những gì tôi nhận được cho "Bỏ qua" trong cảnh báo về loại điều này khi tôi mở dự án. – SnowInferno

+0

Cảm ơn bạn, bạn đời :) Điều đó giúp tôi rất nhiều và giờ đây quy ước của tôi về khóa ngoại là khác và tôi không thể gặp lại vấn đề này :) –

1

Tôi cũng gặp sự cố đó.Kiểm tra xem tên cơ sở dữ liệu đã tồn tại trong Mysql chưa và đổi tên tên cũ.

25

Thay đổi tên khóa ngoài trong MySQL. Bạn không thể có cùng tên khóa ngoài trong bảng cơ sở dữ liệu.

Kiểm tra tất cả các bảng và tất cả các khóa ngoại của bạn và tránh có hai khóa ngoại có cùng tên chính xác.

+0

Đó là vấn đề trong trường hợp của tôi. Tôi sẽ không bao giờ đoán nó và bạn đã cứu ngày của tôi. Sử dụng fk_id_1, fk_id_2 v.v. Cảm ơn. – user3469861

9

Từ hai liên kết Resolved SuccessfullyNaming Convention, Tôi dễ dàng giải quyết vấn đề tương tự mà tôi phải đối mặt. ví dụ: đối với tên khóa ngoài, hãy cung cấp số fk _colName_ Tên bảng. Quy ước đặt tên này không rõ ràng và cũng làm cho mọi ForeignKey trong Mô hình DB của bạn trở nên độc đáo và bạn sẽ không bao giờ gặp lỗi này.

Lỗi 1022: Không thể viết; khóa trùng lặp trong bảng

+0

Điểm tốt về tên quy ước: dễ dàng và không ambiguos – Chococroc

2

Điều này cũng có thể phát sinh liên quan đến lỗi trong các phiên bản nhất định của công cụ thay đổi lược đồ trực tuyến của Bộ công cụ Percona. Để thay đổi một bảng lớn, pt-osc đầu tiên tạo một bảng trùng lặp và sao chép tất cả các bản ghi vào nó. Trong một số trường hợp, một số phiên bản của pt-osc 2.2.x sẽ cố gắng cung cấp các ràng buộc trên bảng mới có cùng tên như các ràng buộc trên bảng cũ.

Bản sửa lỗi được phát hành trong 2.3.0.

Xem https://bugs.launchpad.net/percona-toolkit/+bug/1498128 để biết thêm chi tiết.

2

Tôi vừa dành 4 giờ qua cùng một vấn đề. Những gì tôi đã làm là chỉ cần chắc chắn rằng các ràng buộc có tên duy nhất.

Bạn có thể đổi tên các ràng buộc. Tôi nối thêm một số để khai thác để tôi có thể dễ dàng theo dõi số lần xuất hiện.

Ví dụ

Nếu một hạn chế trong một bảng được đặt tên cậu bé với một chìa khóa X nước ngoài Ràng buộc tiếp theo với phím X nước ngoài có thể được gọi boy1

tôi chắc chắn rằng bạn muốn tìm hiểu tốt hơn tên hơn tôi đã làm.

0

Tôi gặp sự cố này khi tạo bảng mới. Hóa ra cái tên Foreign Key mà tôi đưa ra đã được sử dụng rồi. Đổi tên khóa đã sửa nó.

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