© Éditions Eyrolles
49
chapitre n° 2
Manipulation des données
À partir de la table Pilote, le tableau suivant décrit des modifications (certaines ne vérifient
pas de contraintes). La mise à jour d’une clé étrangère est possible si elle n’est pas référencée
par une clé primaire (voir la section Intégrité référentielle).
Tableau 2-8 Table, données et contraintes
Données
Table et contraintes
Figure 2-7 Données
CREATE TABLE Pilote
(brevet CHAR(6), nom CHAR(15) NOT NULL,
nbHVol DECIMAL(7,2), compa CHAR(4),
CONSTRAINT pk_Pilote
PRIMARY KEY(brevet),
CONSTRAINT ck_nbHVol
CHECK (nbHVol BETWEEN 0 AND 20000),
CONSTRAINT un_nom UNIQUE(nom),
CONSTRAINT fk_Pil_compa_Comp
FOREIGN KEY (compa)
REFERENCES Compagnie(comp));
Web
Pilote
brevet nom
nbHVol
compa
PL-1
Louise Ente
450
AF
PL-2
Jules Ente
900
AF
PL-3
Paul Soutou
1000
SING
Tableau 2-9 Modifications
Vérifiant les contraintes (sauf une !)
Ne vérifiant pas les contraintes
--Modification d’une clé étrangère
UPDATE Pilote SET compa = 'SING'
WHERE brevet = 'PL-2';
-- Modification d’une clé primaire
UPDATE Pilote SET brevet = 'PL3bis'
WHERE brevet = 'PL-3';
--Passe outre la contrainte CHECK !
UPDATE Pilote SET nbHVol= 30000
WHERE brevet = 'PL-1';
Figure 2-8 Après modifications
mysql> UPDATE Pilote SET brevet='PL-2'
WHERE brevet='PL-1';
ERROR 1062 (23000): Duplicate entry
'PL-2' for key 1
mysql> UPDATE Pilote SET nom = NULL
WHERE brevet = 'PL-1';
ERROR 1263 (22004): Column set to
default value; NULL supplied to NOT
NULL column 'nom' at row 1
mysql> UPDATE Pilote SET nom='Paul
Soutou' WHERE brevet = 'PL-1';
ERROR 1062 (23000): Duplicate entry
'Paul Soutou' for key 2
mysql> UPDATE Pilote SET compa='TOTO'
WHERE brevet = 'PL-1';
ERROR 1452 (23000): Cannot add or
update a child row: a foreign key
constraint fails (`bdsoutou/pilote`,
CONSTRAINT `fk_Pil_compa_Comp` FOREIGN
KEY (`compa`) REFERENCES `compagnie`
(`comp`))
Web
Pilote
brevet nom
nbHVol
compa
PL-1
Louise Ente
30000
AF
PL-2
Jules Ente
900
SING
PL3bis Paul Soutou
1000
SING
49
chapitre n° 2
Manipulation des données
À partir de la table Pilote, le tableau suivant décrit des modifications (certaines ne vérifient
pas de contraintes). La mise à jour d’une clé étrangère est possible si elle n’est pas référencée
par une clé primaire (voir la section Intégrité référentielle).
Tableau 2-8 Table, données et contraintes
Données
Table et contraintes
Figure 2-7 Données
CREATE TABLE Pilote
(brevet CHAR(6), nom CHAR(15) NOT NULL,
nbHVol DECIMAL(7,2), compa CHAR(4),
CONSTRAINT pk_Pilote
PRIMARY KEY(brevet),
CONSTRAINT ck_nbHVol
CHECK (nbHVol BETWEEN 0 AND 20000),
CONSTRAINT un_nom UNIQUE(nom),
CONSTRAINT fk_Pil_compa_Comp
FOREIGN KEY (compa)
REFERENCES Compagnie(comp));
Web
Pilote
brevet nom
nbHVol
compa
PL-1
Louise Ente
450
AF
PL-2
Jules Ente
900
AF
PL-3
Paul Soutou
1000
SING
Tableau 2-9 Modifications
Vérifiant les contraintes (sauf une !)
Ne vérifiant pas les contraintes
--Modification d’une clé étrangère
UPDATE Pilote SET compa = 'SING'
WHERE brevet = 'PL-2';
-- Modification d’une clé primaire
UPDATE Pilote SET brevet = 'PL3bis'
WHERE brevet = 'PL-3';
--Passe outre la contrainte CHECK !
UPDATE Pilote SET nbHVol= 30000
WHERE brevet = 'PL-1';
Figure 2-8 Après modifications
mysql> UPDATE Pilote SET brevet='PL-2'
WHERE brevet='PL-1';
ERROR 1062 (23000): Duplicate entry
'PL-2' for key 1
mysql> UPDATE Pilote SET nom = NULL
WHERE brevet = 'PL-1';
ERROR 1263 (22004): Column set to
default value; NULL supplied to NOT
NULL column 'nom' at row 1
mysql> UPDATE Pilote SET nom='Paul
Soutou' WHERE brevet = 'PL-1';
ERROR 1062 (23000): Duplicate entry
'Paul Soutou' for key 2
mysql> UPDATE Pilote SET compa='TOTO'
WHERE brevet = 'PL-1';
ERROR 1452 (23000): Cannot add or
update a child row: a foreign key
constraint fails (`bdsoutou/pilote`,
CONSTRAINT `fk_Pil_compa_Comp` FOREIGN
KEY (`compa`) REFERENCES `compagnie`
(`comp`))
Web
Pilote
brevet nom
nbHVol
compa
PL-1
Louise Ente
30000
AF
PL-2
Jules Ente
900
SING
PL3bis Paul Soutou
1000
SING
