J'essaie d'insérer des valeurs dans ma table de commentaires et j'obtiens une erreur. C'est en disant que je ne peux pas ajouter ou mettre à jour une ligne enfant et que je n'ai aucune idée de ce que cela signifie . Mon schéma ressemble à ceci:
--
-- 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 ;
et la déclaration mysql que j'essaie de faire ressemble à ceci:
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'erreur que je reçois ressemble à ceci:
SQLSTATE [23000]: Violation de contrainte d'intégrité: 1452 Impossible d'ajouter ou mettre à jour une ligne enfant: échec d'une contrainte de clé étrangère (
koxu1996_test
.user
, CONSTRAINTuser_ibfk_1
TOUCHE ÉTRANGÈRE (country
) RÉFÉRENCEScountry_type
(id
) ON SUPPRIMER AUCUNE ACTION LE UPDATE NO ACTUALISATION
Cela signifie simplement que la valeur de la colonne pays dans les commentaires de la table que vous insérez n'existe pas dans la table type_de_ pays ou que vous n'insérez pas de valeur pour le pays dans la table utilisateur . N'oubliez pas que les valeurs de la colonne country country sur les commentaires de la table dépendent des valeurs de l'ID de la table country_type .
Vous avez des clés étrangères entre cette table et une autre table et cette nouvelle ligne violerait cette contrainte.
Si vous exécutez show create table user
, vous devriez pouvoir voir la contrainte. Elle apparaît sous la forme CONSTRAINT...
et indique quelles colonnes font référence à quelles tables/colonnes.
Dans ce cas, country
fait référence à country_type (id)
et vous ne spécifiez pas la valeur de country
. Vous devez mettre une valeur qui existe dans country_type
.
Juste pour ajouter mon propre problème au cas où cela pourrait aider quelqu'un d'autre, je copiais/collaisais des entrées dans mes fichiers de migration et je me suis trompé en mettant des guillemets autour d'un entier. Puisque la valeur que j'essayais d'entrer était considérée comme une chaîne allant dans un champ entier qui référençait un autre entier, cette erreur est survenue.
Dans mon cas, les valeurs de référence ne correspondent pas sur la table associée. Assurez-vous simplement que les valeurs existent dans la table de référence et que les lignes actuelles ont des valeurs valides correspondantes.
Une autre option pourrait être que votre clé primaire dans la table source IS N'EST PAS non signée. J'ai donc résolu le même insert avec (remarque id
int (8) non signée):
CREATE TABLE IF NOT PAS EXISTS
user
(id
int (8) non signé NON null AUTO_INCREMENT,username
varchar (32) COLLATE utf8_bin NON NULL,password
varchar (64) COLLATE utf8_bin NOT NULL,password_real
char (32) COLLATE utf8_bin NON NULL,code
char (8) COLLATE utf8_bin NON 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 NON NULL,name
varchar (32) COLLATE utf8_bin NOT NULL,street
varchar (32) COLLATE utf8_bin NON 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 NON NULL,Zip_code
varchar (32) COLLATE utf8_bin NON NULL,phone_number
varchar (16) COLLATE utf8_bin NON NULL,country
int (8) NON NULL,province
int (8) NOT NULL,pesel
varchar (32) COLLATE utf8_bin NOT NULL,register_time
horodatage NOT NULL DEFAULT CURRENT_TIMESTAMP,authorised_time
datetime NON NULL,edit_time
datetime NON NULL,saldo
décimal (9,2) NON NUL,referer_id
int (8) NON NUL,level
int (8) NON NUL, CLÉ PRIMAIRE (id
), CLÉcountry
(country
), KEYprovince
(province
), KEYreferer_id
(referer_id
)) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin AUTO_INCREMENT = 83;
Dans mon cas, la valeur était vide pour la colonne de la table cible, contrairement à la colonne de la table de référence. par conséquent jetait cette erreur.