2013-07-15 59 views
6

Tôi đang cố gắng chèn giá trị vào bảng nhận xét của mình và tôi gặp lỗi. Nó nói rằng tôi không thể thêm hoặc cập nhật hàng con và tôi không có ý tưởng đó có nghĩa là gì. schema của tôi trông giống như sau:SQLSTATE [23000]: Vi phạm ràng buộc toàn vẹn: 1452 Không thể thêm hoặc cập nhật hàng con: ràng buộc khóa ngoài không thành công

-- 
-- Baza danych: `koxu1996_test` 
-- 

-- -------------------------------------------------------- 

-- 
-- Struktura tabeli dla tabeli `user` 
-- 

CREATE TABLE IF NOT EXISTS `user` (
    `id` int(8) NOT NULL AUTO_INCREMENT, 
    `username` varchar(32) COLLATE utf8_bin NOT NULL, 
    `password` varchar(64) COLLATE utf8_bin NOT NULL, 
    `password_real` char(32) COLLATE utf8_bin NOT NULL, 
    `email` varchar(32) COLLATE utf8_bin NOT NULL, 
    `code` char(8) COLLATE utf8_bin NOT NULL, 
    `activated` enum('0','1') COLLATE utf8_bin NOT NULL DEFAULT '0', 
    `activation_key` char(32) COLLATE utf8_bin NOT NULL, 
    `reset_key` varchar(32) COLLATE utf8_bin NOT NULL, 
    `name` varchar(32) COLLATE utf8_bin NOT NULL, 
    `street` varchar(32) COLLATE utf8_bin NOT NULL, 
    `house_number` varchar(32) COLLATE utf8_bin NOT NULL, 
    `apartment_number` varchar(32) COLLATE utf8_bin NOT NULL, 
    `city` varchar(32) COLLATE utf8_bin NOT NULL, 
    `zip_code` varchar(32) COLLATE utf8_bin NOT NULL, 
    `phone_number` varchar(16) COLLATE utf8_bin NOT NULL, 
    `country` int(8) NOT NULL, 
    `province` int(8) NOT NULL, 
    `pesel` varchar(32) COLLATE utf8_bin NOT NULL, 
    `register_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `authorised_time` datetime NOT NULL, 
    `edit_time` datetime NOT NULL, 
    `saldo` decimal(9,2) NOT NULL, 
    `referer_id` int(8) NOT NULL, 
    `level` int(8) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `country` (`country`), 
    KEY `province` (`province`), 
    KEY `referer_id` (`referer_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=83 ; 

và báo cáo kết quả mysql Tôi cố gắng để làm trông giống như sau:

INSERT INTO `user` (`password`, `code`, `activation_key`, `reset_key`, `register_time`,    `edit_time`, `saldo`, `referer_id`, `level`) VALUES (:yp0, :yp1, :yp2, :yp3, NOW(), NOW(), :yp4, :yp5, :yp6). Bound with :yp0='fa1269ea0d8c8723b5734305e48f7d46', :yp1='F154', :yp2='adc53c85bb2982e4b719470d3c247973', :yp3='', :yp4='0', :yp5=0, :yp6=1 

lỗi tôi nhận trông như sau:

SQLSTATE [23000]: Vi phạm ràng buộc toàn vẹn: 1452 Không thể thêm hoặc cập nhật hàng con: ràng buộc khóa ngoài không thành công (koxu1996_test. user, CONSTRAINT user_ibfk_1 FOREIGN KEY (country) THAM KHẢO country_type (id) ON DELETE không tác dụng trên CẬP NHẬT KHÔNG HÀNH ĐỘNG)

+1

Bạn có nhìn vào bất kỳ câu hỏi/câu trả lời tương tự nào ở đây của SO trước khi đăng không? Thông báo lỗi của bạn rõ ràng cho bạn biết rằng giá trị 'koxu1996_test.country' bạn đang (không phải) chèn không phải là giá trị hợp lệ từ' country_type.id'. – Sean

Trả lời

16

Nó chỉ đơn giản có nghĩa rằng giá trị cho đất nước cột trên bảng bình luận của bạn đang chèn không tồn tại trên bảng country_type hoặc bạn không chèn giá trị cho quốc gia trên bảng người dùng. Hãy nhớ rằng các giá trị của quốc gia cột trên các nhận xét của bảng phụ thuộc vào các giá trị của ID trên bảng country_type.

3

Bạn có khóa ngoài giữa bảng này và bảng khác và hàng mới sẽ vi phạm ràng buộc đó.

Bạn sẽ có thể thấy ràng buộc nếu bạn chạy show create table user, nó hiển thị dưới dạng CONSTRAINT... và nó hiển thị những cột nào tham chiếu đến bảng/cột nào.

Trong trường hợp này là country tham chiếu country_type (id) và bạn không chỉ định giá trị country. Bạn cần đặt giá trị tồn tại trong country_type.

1

Chỉ để ném vào vấn đề của riêng tôi trong trường hợp nó có thể giúp đỡ người khác, tôi đã sao chép/dán các mục nhập trong các tệp di chuyển của mình và làm sai lệch bằng cách đặt dấu ngoặc kép quanh một số nguyên. Kể từ khi giá trị tôi đã cố gắng để nhập được coi là một chuỗi đi vào một trường số nguyên được tham chiếu đến một số nguyên, lỗi này đã đưa ra.

0

Một lựa chọn khác có thể là thath khóa chính của bạn trong bảng nguồn LÀ KHÔNG unsigned, vì vậy tôi đã giải quyết tương tự chèn với (thông báo id int (8) unsigned):

CREATE TABLE IF NOT EXISTS user (id int (8) unsigned NOT NULL AUTO_INCREMENT, username varchar (32) đối chiếu utf8_bin NOT NULL,
password varchar (64) đối chiếu utf8_bin NOT NULL, password_real char (32) đối chiếu utf8_bin NOT NULL, email varchar (32) đối chiếu utf8_bin NOT NULL, code char (8) đối chiếu utf8_bin NOT NULL,
activated enum ('0', '1') đối chiếu utf8_bin NOT DEFAULT NULL '0',
activation_key char (32) đối chiếu utf8_bin NOT NULL, reset_key varchar (32) đối chiếu utf8_bin NOT NULL, name varchar (32) đối chiếu utf8_bin NOT NULL, street varchar (32) đối chiếu utf8_bin NOT NULL,
house_number varchar (32) đối chiếu utf8_bin NOT NULL,
apartment_number varchar (32) đối chiếu utf8_bin NOT NULL, city varchar (32) COLLATE utf8_bin NOT NULL, zip_code varchar (32) đối chiếu utf8_bin NOT NULL, phone_number varchar (16) đối chiếu utf8_bin NOT NULL, country int (8) NOT NULL, province int (8) NOT NULL, pesel varchar (32) đối chiếu utf8_bin NOT NULL,
register_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
authorised_time datetime NOT NULL, edit_time datetime NOT NULL, saldo thập phân (9,2) NOT NULL, referer_id int (8) NOT NULL,
level int (8) NOT NULL, TIỂU KEY (id), KEY country (country), KEY province (province), KEY referer_id (referer_id)) ENGINE = InnoDB DEFAULT CHARSET = utf8 đối chiếu utf8_bin = AUTO_INCREMENT = 83;

0

Trong trường hợp của tôi, giá trị trống cho cột bảng mục tiêu trong khi cột bảng tham chiếu có cột đó. do đó đã ném lỗi này.

0

Trong trường hợp của tôi, giá trị tham chiếu không tương ứng trên bảng có liên quan. Chỉ cần chắc chắn rằng các giá trị tồn tại trên các bảng tham chiếu và các hàng dòng có các giá trị hợp lệ tương ứng.

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