Próbuję wstawić wartości do mojej tabeli komentarzy i pojawia się błąd. Mówi, że nie mogę dodawać ani aktualizować wiersza podrzędnego i nie mam pojęcia, co to oznacza.
mój schemat wygląda mniej więcej tak
-- ----------------------------
-- Table structure for `comments`
-- ----------------------------
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
`id` varchar(36) NOT NULL,
`project_id` varchar(36) NOT NULL,
`user_id` varchar(36) NOT NULL,
`task_id` varchar(36) NOT NULL,
`data_type_id` varchar(36) NOT NULL,
`data_path` varchar(255) DEFAULT NULL,
`message` longtext,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_comments_users` (`user_id`),
KEY `fk_comments_projects1` (`project_id`),
KEY `fk_comments_data_types1` (`data_type_id`),
CONSTRAINT `fk_comments_data_types1` FOREIGN KEY (`data_type_id`) REFERENCES `data_types` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_comments_projects1` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_comments_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;
-- ----------------------------
-- Records of comments
-- ----------------------------
-- ----------------------------
-- Table structure for `projects`
-- ----------------------------
DROP TABLE IF EXISTS `projects`;
CREATE TABLE `projects` (
`id` varchar(36) NOT NULL,
`user_id` varchar(36) NOT NULL,
`title` varchar(45) DEFAULT NULL,
`description` longtext,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_projects_users1` (`user_id`),
CONSTRAINT `fk_projects_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;
-- ----------------------------
-- Records of projects
-- ----------------------------
INSERT INTO `projects` VALUES ('50dcbc72-3410-4596-8b71-0e80ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', 'Brand New Project', 'This is a brand new project', '2012-12-27 15:24:02', '2012-12-27 15:24:02');
a instrukcja mysql, którą próbuję zrobić, wygląda mniej więcej tak
INSERT INTO `anthonyl_fbpj`.`comments` (`project_id`, `user_id`, `task_id`, `data_type_id`, `message`, `modified`, `created`, `id`)
VALUES ('50dc845a-83e4-4db3-8705-5432ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', '1', '50d32e5c-abdc-491a-a0ef-25d84e9f49a8', 'this is a test', '2012-12-27 19:20:46', '2012-12-27 19:20:46', '50dcf3ee-8bf4-4685-aa45-4eb4ae7aaee3')
otrzymany błąd wygląda następująco
SQLSTATE [23000]: Naruszenie ograniczenia integralności: 1452 Nie można dodać lub zaktualizować wiersza podrzędnego: ograniczenie klucza obcego nie powiodło się (
anthonyl_fbpj
.comments
, OGRANICZANIEfk_comments_projects1
KLUCZA OBCEGO (project_id
) REFERENCJEprojects
(id
) ON DELETE BRAK AKCJI PRZY AKTUALIZACJI BRAK AKCJI)
Upewnij się, że masz
project_id
wfillable
posiadaniu swojegoComment
modelu.Miałem ten sam problem i to był powód.
źródło
Upewnij się również, że dodany klucz obcy jest tego samego typu, co oryginalna kolumna, jeśli kolumna, do której się odwołujesz, nie jest tego samego typu, również zakończy się niepowodzeniem.
źródło
Jeśli dodajesz nowy klucz obcy do istniejącej tabeli, a kolumny nie są puste i nie mają przypisanej wartości domyślnej, otrzymasz ten błąd,
Albo trzeba to zrobić
nullable
alboassign default value
, lubdelete all the existing records
, aby go rozwiązać.źródło
Oznacza to, że wartość kolumny
project_id
w tabeli,comments
którą wstawiasz, nie tylkodoesn't exist
w projektach tabeli, aleproject_id
prawdopodobnie również nie ma wartości domyślnej . Np. W moim przypadku ustawiłem ją na NULL.Jeśli chodzi o Laravel, możesz potraktować to wyrażenie jako fragment kodu migracyjnego pliku php, na przykład:
{ /** * Run the migrations. * * @return void */
}
Oczywiście obok tego wszystkiego trzeba było stworzyć klasę Model (w moim przypadku była to Photo).
źródło
Najpierw usuń ograniczenie „fk_comments_projects1”, a także jego indeks. Następnie odtwórz go.
źródło
Mam nadzieję, że moja decyzja pomoże. Miałem podobny błąd w Laravel. Dodałem klucz obcy do złej tabeli.
Niepoprawny kod:
Schema::create('comments', function (Blueprint $table) { $table->unsignedBigInteger('post_id')->index()->nullable(); ... $table->foreign('post_id')->references('id')->on('comments')->onDelete('cascade'); }); Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('id'); ... });
Zwróć uwagę na funkcję w („komentarze”) powyżej. Prawidłowy kod
źródło
Ten błąd pojawia się również, jeśli nie utworzysz i nie wypełnisz swoich tabel we właściwej kolejności. Na przykład, w zależności od schematu, Komentarze potrzeb stołowe
user_id
,project_id
,task_id
idata_type_id
. Oznacza to, żeUsers
stół,Projects
stół,Task
stół iData_Type
stół muszą już wyjść i zawierać wartości, zanim będzie można odwołać się do ich identyfikatorów lub jakiejkolwiek innej kolumny.W Laravel oznaczałoby to wywołanie seederów bazy danych w odpowiedniej kolejności:
class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(UserSeeder::class); $this->call(ProjectSeeder::class); $this->call(TaskSeeder::class); $this->call(DataTypeSeeder::class); $this->call(CommentSeeder::class); } }
W ten sposób rozwiązałem podobny problem.
źródło
Jeśli ktoś używa Laravel i napotyka ten problem. Otrzymywałem to również i problem był w kolejności, w której wstawiałem identyfikatory (tj. Klucze obce) do tabeli przestawnej.
Aby być konkretnym, poniżej przykład relacji wiele do wielu:
wordtokens <-> wordtoken_wordchunk <-> wordchunks
// wordtoken_wordchunk table Schema::create('wordtoken_wordchunk', function(Blueprint $table) { $table->integer('wordtoken_id')->unsigned(); $table->integer('wordchunk_id')->unsigned(); $table->foreign('wordtoken_id')->references('id')->on('word_tokens')->onDelete('cascade'); $table->foreign('wordchunk_id')->references('id')->on('wordchunks')->onDelete('cascade'); $table->primary(['wordtoken_id', 'wordchunk_id']); }); // wordchunks table Schema::create('wordchunks', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); $table->string('text'); }); // wordtokens table Schema::create('word_tokens', function (Blueprint $table) { $table->increments('id'); $table->string('text'); });
Teraz moje modele wyglądają następująco:
Rozwiązałem problem, zmieniając kolejność „wordchunk_id” i „wordtoken_id” w modelu Wordchunk.
Aby uzupełnić kod, utrwalam modele w następujący sposób:
źródło
Może masz jakieś wiersze w tabeli, które chcesz utworzyć de FK.
Uruchom migrację z wartością Foreign_key_checks OFF Wstaw tylko te rekordy, które mają odpowiednie pole id w spisie treści.
źródło
Miałem ten problem, gdy przypadkowo użyłem NIEPRAWIDŁOWEGO „uuidu” w rekordzie dziecka. Kiedy tak się dzieje, ograniczenie patrzy od dziecka do rekordu nadrzędnego, aby upewnić się, że łącze jest poprawne. Generowałem go ręcznie, kiedy już skonfigurowałem mój Model, aby robił to automatycznie. Więc moja poprawka brzmiała:
$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent
Następnie, kiedy zadzwoniłem do mojej klasy podrzędnej, aby wstawić dzieci, przekazałem tę wartość zmiennej:
Mam nadzieję, że to pomoże.
źródło
Miałem ten sam błąd, problem polegał na tym, że próbowałem dodać
role_id
obcy dousers
tabeli, alerole_id
nie miałem wartości domyślnej, więc DB nie pozwolił mi wstawić kolumny, ponieważ miałem już kilku użytkowników i nie było wiedzieć, jak dodać do nich kolumnę. Ponieważ byłem w fazie rozwoju, właśnie użyłemmigrate:fresh
, ale gdybym był na produkcji, prawdopodobnie ustawiłbym domyślną wartość narole_id
i nie ograniczałbym jej, dopóki nie otrzymałem odpowiedniej roli w DB.źródło