2013-07-15 9 views
6

Próbuję wstawić wartości do mojej tabeli komentarzy i pojawia się błąd. Mówi, że nie mogę dodawać ani aktualizować rzędów dzieci i nie mam pojęcia, co to oznacza. Mój schemat wygląda mniej więcej tak:SQLSTATE [23000]: Naruszenie ograniczenia integralności: 1452 Nie można dodać lub zaktualizować wiersza podrzędnego: nie działa ograniczenie klucza obcego

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

i mysql oświadczenie próbuję zrobić wygląda mniej więcej tak:

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 

błąd pojawia się wygląda następująco:

SQLSTATE [23000]: Naruszenie ograniczenia integralności: 1452 Nie można dodać lub zaktualizować wiersza podrzędnego: nie powiodło się ograniczenie klucza obcego (koxu1996_test., CONSTRAINT user_ibfk_1 FOREIGN KEY (country) odniesienia country_type (id) ON DELETE żadnego działania na UPDATE NO ACTION)

+1

Czy patrzyłeś na którekolwiek z podobnych pytań/odpowiedzi na stronie SO przed wysłaniem? Twój komunikat o błędzie wyraźnie informuje cię, że wartość 'koxu1996_test.country', którą wstawiłeś (nie jest) nie jest poprawną wartością z' country_type.id'. – Sean

Odpowiedz

16

To po prostu oznacza, że ​​wartość dla kolumny kraju na stole komentuje wstawiasz nie istnieje na tabeli country_type lub nie wstawiasz wartości dla kraju na tabeli użytkownik. Należy pamiętać, że wartości w kolumnie kraju w komentarzach do tabeli zależą od wartości identyfikatora w tabeli country_type.

3

Masz klucze obce między tą tabelą a inną tabelą, a nowy wiersz narusza to ograniczenie.

Powinieneś być w stanie zobaczyć ograniczenie, jeśli uruchomisz show create table user, pojawi się jako CONSTRAINT... i pokazuje, jakie kolumny odnoszą się do tabel/kolumn.

W tym przypadku country odnosi się do country_type (id) i nie podajesz wartości country. Musisz podać wartość, która istnieje w country_type.

1

Wystarczy podać własny numer na wypadek, gdyby mógł pomóc komuś innemu, kopiowałem/wklejałem wpisy w moich plikach migracyjnych i pomieszałem, umieszczając cytaty wokół liczby całkowitej. Ponieważ wartość, którą próbowałem wprowadzić, była traktowana jako ciąg idący do pola liczb całkowitych, który odwoływał się do innej liczby całkowitej, pojawił się ten błąd.

0

Innym rozwiązaniem mogłoby być Tat podstawowego klucza w tabeli źródłowej nie jest podpisany, więc rozwiązać tę samą wkładkę z (Zawiadomienie id int (8) unsigned):

CREATE TABLE IF NOT EXISTS user (id int (8) bez znaku nie NULL AUTO_INCREMENT, username VARCHAR (32) SORTOW.- utf8_bin nie NULL
password VARCHAR (64) SORTOW.- utf8_bin nie NULL password_real znak (32) SORTOW.- utf8_bin nie NULL email VARCHAR (32) SORTOW.- utf8_bin nie NULL code CHAR (8) SORTOW.- utf8_bin niezerowy, wówczas
activated wyliczenia ('0', '1') SORTOW.- utf8_bin NULL DEFAULT '0',
activation_key znak (32) SORTOW.- utf8_bin nie NULL reset_key VARCHAR (32) SORTOW.- utf8_bin nie NULL name VARCHAR (32) SORTOW.- utf8_bin niezerowy, street varchar (32) SORTOW.- utf8_bin nie NULL
house_number VARCHAR (32) SORTOW.- utf8_bin nie NULL
apartment_number VARCHAR (32) UKŁADAJ utf8_bin NOT NULL, city varchar (32) COLLATE utf8_bin NOT NULL, zip_code VARCHAR (32) UKŁADAJ utf8_bin nie NULL phone_number VARCHAR (16) SORTOW.- utf8_bin nie NULL country int (8) nie NULL province int (8) niezerowy, wówczas pesel VARCHAR (32) SORTOW.- utf8_bin nie NULL
register_time nie datownik NULL DEFAULT CURRENT_TIMESTAMP,
authorised_time DateTime nie NULL edit_time DateTime nie NULL saldo dziesiętny (9,2) nie NULL referer_id int (8) nie NULL
level int (8) nie NULL PRIMARY KLUCZ (id), KLUCZ country (country) KLUCZ province (province) KLUCZ referer_id (referer_id)) Silnik = InnoDB Domyślnym zestawem = utf8 UKŁADAJ = utf8_bin AUTO_INCREMENT = 83;

0

W moim przypadku wartość była pusta dla kolumny tabeli docelowej, gdy kolumna tabeli odniesienia ją ma. dlatego rzucił ten błąd.

0

W moim przypadku wartości referencyjne nie odpowiadają w powiązanej tabeli. Po prostu upewnij się, że wartości istnieją w tabeli odniesienia, a bieżące wiersze mają odpowiednie poprawne wartości.

Powiązane problemy