Database problemen
Query: CREATE TABLE `t5s10_osmap_sitemap_menus` (
`sitemap_id` int(11) unsigned NOT NULL,
`menutype_id` int(11) NOT NULL,
`changefreq` enum('always','hourly','daily','weekly','monthly','yearly','never') NOT NULL DEFAULT 'weekly',
`priority` float NOT NULL DEFAULT '0.5',
`ordering` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`sitemap_id`,`menutype_id`),
KEY `idx_ordering` (`sitemap_id`,`ordering`),
KEY `idx_sitemap_menus` (`sitemap_id`),
CONSTRAINT `fk_sitemaps_menus` FOREIGN KEY (`sitemap_id`) REFERENCES `t5s10_osmap_sitemaps` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
MySQL: Can't create table `nadine_united`.`t5s10_osmap_sitemap_menus` (errno: 150 "Foreign key constraint is incorrectly formed")
Groetjes, Nadine
kennelijk is de kolom id in de tabel t5s10_osmap_sitemaps _niet_ een unsigned int(11)
Bedankt voor je antwoord maar kan ik dit oplossen?
Is 'bigdumper' de enige manier? Zijn er geen manieren via phpMyAdmin of via een Hosting control panel (zoals DirectAdmin?), of anderzijds misschien via SSH als je daar ervaring genoeg voor hebt?
Gewijzigd op 16/10/2020 15:05:00 door - Ariën -
het sql bestand is blijkbaar te groot om te importeren via phpmyadmin.
Ik krijg telkens een foutmelding.
groetjes,
Nadine
Die komt niet overeen met zijn tegenoverliggende veld in 't5s10_osmap_sitemap_menus'
Hoe staan die instellingen?
`t5s10_osmap_sitemaps` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`params` text,
`is_default` tinyint(1) NOT NULL DEFAULT '0',
`published` tinyint(1) NOT NULL DEFAULT '1',
`created_on` datetime DEFAULT NULL,
`links_count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `default_idx` (`is_default`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
`t5s10_osmap_sitemap_menus` (
`sitemap_id` int(11) unsigned NOT NULL,
`menutype_id` int(11) NOT NULL,
`changefreq` enum('always','hourly','daily','weekly','monthly','yearly','never') NOT NULL DEFAULT 'weekly',
`priority` float NOT NULL DEFAULT '0.5',
`ordering` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`sitemap_id`,`menutype_id`),
KEY `idx_ordering` (`sitemap_id`,`ordering`),
KEY `idx_sitemap_menus` (`sitemap_id`),
CONSTRAINT `fk_sitemaps_menus` FOREIGN KEY (`sitemap_id`) REFERENCES `t5s10_osmap_sitemaps` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
Ik zie het niet in de query maar misschien komen de collaties niet overeen?
(al zou ik dan meer een melding in de trand van "tabel t5s10_osmap_sitemaps not found" verwachten)
Je kunt aan MySQL vragen om de relaties tussen gegevens in verschillende tabelkolommen tijdelijk niet te bewaken, zodat je de gegevens in ieder geval kunt importeren.
Wil je dat alleen voor de huidige sessie doen, dan kan je dit MySQL-commando gebruiken:
Wil je dat voor heel de MySQL database doen, bijvoorbeeld in een aparte sessie via phpMyAdmin, dan kan je deze gebruiken:
Na het corrigeren van de gegevens kan je de controle weer aanzetten met de waarde 1.
Voor meer info zie:
- MySQL: https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_foreign_key_checks
- MariaDB: https://mariadb.com/docs/reference/mdb/system-variables/foreign_key_checks/
Code (php)
1
-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
voorkomen, bij een import waarbij je de volgorde van invoeren niet eenvoudig kunt regelen. (je wilt bijvoorbeeld eerst de eigenschappen van een product inserten en pas daarna het product zelf. Dus eerst het je een berg eigenschappen die nog naar een niet-bestaand product wijzen)
Maar TS heeft een probleem om de de FK relatie te leggen tussen 2 tabellen.
Dat komt vaker voor als je bijvoorbeeld in de ene tabel een id-kolom hebt van het type INT(11)
en in de andere tabel de verwijzing naar die tabel/kolom doet in een kolom van een ander type.
Bijvoorbeeld in een kolom van het type DATE.
Nu ligt het er met DATE erg dik bovenop dat het een ander type is, maar ook een DECIMAL, TINYINT of BIGINT leidt tot deze foutmelding.
Maar in de aanwijzingen van TS komt not niet echt naar voren waar de schoen hier wringt:
in beide tabellen lijkt het een INT(11) UNSIGNED te zijn.
Het is zaak dat de t5s10_osmap_sitemaps tabel bestaat voordat je de t5s10_osmap_sitemap_menus tabel (die aan de eerstgenoemde tabel refereert) aanmaakt.
Wat je ook kunt doen, zoals @AdFundum voorstelt, is tijdelijk de foreign key checks uitzetten zodat MySQL hier niet over struikelt.
Ik weet verder niet hoe "BigDump(er)" precies werkt? Hoe groot is de database/het importbestand precies?
Met een kleine aanpassing (CREATE TABLE) erbij werkt het prima.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE `t5s10_osmap_sitemaps` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`params` text,
`is_default` tinyint(1) NOT NULL DEFAULT '0',
`published` tinyint(1) NOT NULL DEFAULT '1',
`created_on` datetime DEFAULT NULL,
`links_count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `default_idx` (`is_default`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `t5s10_osmap_sitemap_menus` (
`sitemap_id` int(11) unsigned NOT NULL,
`menutype_id` int(11) NOT NULL,
`changefreq` enum('always','hourly','daily','weekly','monthly','yearly','never') NOT NULL DEFAULT 'weekly',
`priority` float NOT NULL DEFAULT '0.5',
`ordering` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`sitemap_id`,`menutype_id`),
KEY `idx_ordering` (`sitemap_id`,`ordering`),
KEY `idx_sitemap_menus` (`sitemap_id`),
CONSTRAINT `fk_sitemaps_menus` FOREIGN KEY (`sitemap_id`)
REFERENCES `t5s10_osmap_sitemaps` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`params` text,
`is_default` tinyint(1) NOT NULL DEFAULT '0',
`published` tinyint(1) NOT NULL DEFAULT '1',
`created_on` datetime DEFAULT NULL,
`links_count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `default_idx` (`is_default`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `t5s10_osmap_sitemap_menus` (
`sitemap_id` int(11) unsigned NOT NULL,
`menutype_id` int(11) NOT NULL,
`changefreq` enum('always','hourly','daily','weekly','monthly','yearly','never') NOT NULL DEFAULT 'weekly',
`priority` float NOT NULL DEFAULT '0.5',
`ordering` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`sitemap_id`,`menutype_id`),
KEY `idx_ordering` (`sitemap_id`,`ordering`),
KEY `idx_sitemap_menus` (`sitemap_id`),
CONSTRAINT `fk_sitemaps_menus` FOREIGN KEY (`sitemap_id`)
REFERENCES `t5s10_osmap_sitemaps` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Ben niet helemaal zeker over die AUTO_INCREMENT=2 though.