Je suis en train de regarder comment fonctionne MySQL avec InnoDB.
Le systeme de transaction est classique, mais on m’avait rapporte un probleme rigolo:
Si on genere une table avec des contraintes et que les tables lies sont alphabetiquement apres la table liee, ca chie a la restoration. Exemple:
[code]CREATE TABLE alpha
(
aid
int(11) NOT NULL auto_increment,
product_category
int(11) NOT NULL default ‹ 0 ›,
product_id
int(11) NOT NULL default ‹ 0 ›,
customer_id
int(11) NOT NULL default ‹ 0 ›,
PRIMARY KEY (aid
),
KEY product_category
(product_category
,product_id
),
KEY customer_id
(customer_id
),
CONSTRAINT alpha_ibfk_1
FOREIGN KEY (product_category
, product_id
) REFER
ENCES product
(category
, id
) ON UPDATE CASCADE,
CONSTRAINT alpha_ibfk_2
FOREIGN KEY (customer_id
) REFERENCES customer
( id
)
) TYPE=InnoDB;
INSERT INTO alpha
VALUES (1,1,1,2);
INSERT INTO alpha
VALUES (2,1,2,1);
CREATE TABLE customer
(
id
int(11) NOT NULL default ‹ 0 ›,
PRIMARY KEY (id
)
) TYPE=InnoDB;
INSERT INTO customer
VALUES (1);
INSERT INTO customer
VALUES (2);
CREATE TABLE product
(
category
int(11) NOT NULL default ‹ 0 ›,
id
int(11) NOT NULL default ‹ 0 ›,
price
decimal(10,0) default NULL,
PRIMARY KEY (category
,id
)
) TYPE=InnoDB;
INSERT INTO product
VALUES (1,1,‹ 10 ›);
INSERT INTO product
VALUES (1,2,‹ 20 ›);
INSERT INTO product
VALUES (2,2,‹ 200 ›);[/code]
La, ca plante totalement a la restauration, vu que les tables a lier sont creees apres la table en relation (oui, c’est vraiment tres con).
La solution (ou plutot le workaround bien degueu), c’est de faire ca:
[code]SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS = 0;
—Code SQL a restaurer
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;[/code]
Oui, c’est uber barbare comme workaround.
De fait, ca passe comme une lettre a la poste. Probleme, si le dump est inconsistent a la base, ca passe aussi. Pour faire un essai, j’ai vire la ligne suivante:
INSERT INTO customer
VALUES (2);
Ce INSERT est pourtant obligatoire pour la table alpha (premiere ligne)
J’ai donc maintenant une BDD qui a un probleme de FK, et j’essaye de trouver une commande qui verifie la consistence de ma BDD.
Je pensais avoir trouver la solution avec cette page qui explique comment tester les tables, mais ca donne rien:
ANALYSE TABLE dit OK, de meme que CHECK TABLE, malgre l’option EXTENDED active. J’ai fait le test sur toutes les tables, rien a faire, il voit pas l’erreur.
Rappel de l’etat des tables:
[code]mysql> select * from customer;
±—+
| id |
±—+
| 1 |
±—+
–Erreur ici: il devrait y avoir 2 aussi.
mysql> select * from alpha;
±----±-----------------±-----------±------------+
| aid | product_category | product_id | customer_id |
±----±-----------------±-----------±------------+
| 1 | 1 | 1 | 2 | <–cette ligne doit poser probleme.
| 2 | 1 | 2 | 1 |
±----±-----------------±-----------±------------+
mysql> select * from product;
±---------±—±------+
| category | id | price |
±---------±—±------+
| 1 | 1 | 10 |
| 1 | 2 | 20 |
| 2 | 2 | 200 |
±---------±—±------+[/code]
Quelqu’un connait une solution pour tester la consistence ? (google est pas mon ami, il me renvoie sur check table, qui marche pas, donc)
Note: using mysql-server 4.0.22-2 , Sarge daily updated version.
Merci d’avance
LoneWolf
J’ai surement du rater une etape, mais laquelle?