Je sais que la colonne existe.
Mais il faut que les lignes existent.
Seulement 5 si vous voulez.
Il faut que les valeurs de pos_id existent dans la table position avant de les mettre dans la table machine sinon vous aurez une erreur.
Je sais que la colonne existe.
Mais il faut que les lignes existent.
Seulement 5 si vous voulez.
Il faut que les valeurs de pos_id existent dans la table position avant de les mettre dans la table machine sinon vous aurez une erreur.
Petit retour en arrière : je viens d'apprendre une contrainte supplémentaire : ne pas toucher à la table 'machines' (donc 'machinenew' et les clés étrangères, on oublie). Par contre, il reste possible de créer des tables supplémentaires. Et pour info, je peux construire les informations type du serveur et position à partir de la table 'machines'. Pour type du serveur, celle-ci comporte une colonne 'type'. Et pour position, il y a la colonne 'localization'.
Je pense qu'il y a moyen de faire des select sans clé étrangère, du style. Je viens d'essayer et ça fonctionne sauf pour la valeur 'Other...' de la colonne 'type'. Pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select machines.type from machines,serveur_type WHERE machines.type=serveur_type.type
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
Si la discussion est résolue, merci de cliquer sur le bouton
Si vous avez tout dans la même table de toute façon, pas besoin de jointure, non ?
Qu'est-ce que vous voulez faire comme requête ?
Non, tout n'est pas dans la même table vu qu'il va en rester 3. Pour le moment :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 CREATE TABLE IF NOT EXISTS `machines` ( `name` varchar(20) COLLATE latin1_bin DEFAULT NULL, `localization` varchar(30) COLLATE latin1_bin DEFAULT NULL, `pays` varchar(30) COLLATE latin1_bin NOT NULL DEFAULT '', `entite` varchar(20) COLLATE latin1_bin DEFAULT NULL, `perimetre` set('Oui','Non') COLLATE latin1_bin DEFAULT NULL, `type` varchar(20) COLLATE latin1_bin DEFAULT NULL, `id` smallint(6) NOT NULL AUTO_INCREMENT, `comment` varchar(100) COLLATE latin1_bin DEFAULT NULL, `ip` varchar(15) COLLATE latin1_bin DEFAULT NULL, `contact_name` varchar(50) COLLATE latin1_bin DEFAULT NULL, `contact_phone` varchar(50) COLLATE latin1_bin DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=427 ;
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE IF NOT EXISTS `position` ( `pos_id` smallint(6) NOT NULL AUTO_INCREMENT, `positionX` int(11) DEFAULT NULL, `positionY` int(11) DEFAULT NULL, PRIMARY KEY (`pos_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ROW_FORMAT=COMPRESSED AUTO_INCREMENT=6 ;
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TABLE IF NOT EXISTS `serveur_type` ( `type_id` smallint(6) NOT NULL AUTO_INCREMENT, `type` varchar(100) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`type_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=5 ;
sauf que comme machines est non modifiable, à mon avis jointure impossible, vu que clé étrangère impossible.
La (ou les) requête(s) à faire doit(vent) permettre d'afficher par position (ou localization) les différents types de machine, et par type les différentes machines.
Un exemple (simpliste) :
Grenoble
---type1
------machine1-1
------machine1-2
---type2
------machine2-1
------machine2-2
------machine2-3
Bordeaux
---type1
------machine1-1
;à remarquer le trou entre type1 et type4
---type4
------machine4-1
------machine4-2
------machine4-3
---type6
------machine6-1
------machine6-2
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
Si la discussion est résolue, merci de cliquer sur le bouton
Bonjour,
Alors vous pourriez créer une table MACHINE_DETAIL, avec comme une clef étrangère référençant la table machine, et qui serait également clef primaire comme dans un cas d'héritage (ou en l'occurrence de partitionnement vertical).
Si vous avez le droit de créer des tables, alors j’imagine que vous pouvez aussi créer des vues. Vous pouvez alors créer une vue MACHINE_NEW, qui ferait la jointure entre les tables MACHINE et MACHINE_DETAIL.
Mais dans tous les cas, je pense qu'il faut résoudre votre problème de modélisation avant de penser à résoudre votre problème de requête.
merci pour la réponse ; j'avoue être un peu largué étant peu expérimenté en SQL. Néanmoins, j'ai tenté de suivre vos indications, mais ça coince au niveau de la création de la table machine_detail :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 create table machine_detail ( id_mach_detail smallint(6) NOT NULL , PRIMARY KEY (`id_mach_detail`), constraint `fk_machine` foreign key(`id`) references `machines` ) engine=innoDB default charset=latin1 collate=latin1_general_ci
provoque le messagealors que cette colonne existe bien dans la table machines ; comprenez-vous le problème ?La clé 'id' n'existe pas dans la table
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
Si la discussion est résolue, merci de cliquer sur le bouton
essayez comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 create table machine_detail ( id_mach_detail smallint(6) NOT NULL , PRIMARY KEY (`id_mach_detail`), constraint `fk_machine` foreign key(`id_mach_detail`) references `machines`(`id`) ) engine=innoDB default charset=latin1 collate=latin1_general_ci
Confirmation de mon manque d'expérience en sql ; néanmoins votre requête donne#1215 - Impossible d'ajouter des contraintes d'index externe
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
Si la discussion est résolue, merci de cliquer sur le bouton
J'adore la précision des messages d'erreur de MySQL
d'après votre dernier script, votre table machine utilise MyISAM, il faudrait qu'elle soit en InnoDB pour pouvoir mettre en place les contraintes référentielles.
Bien vu pour mettre la table en InnoDB.
Je verrai demain pour la création de la vue (notion que je ne connaissais pas) et le reste.
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
Si la discussion est résolue, merci de cliquer sur le bouton
J'avais dit demain : je commence bien mon post samedi mais pas sûr de le finir samedi !
Je regarde la création de la vue ; en fait, j'ai besoin d'informations de la table machines (name), serveur_type (type) et position (que je viens de changer)(positionX et positionY)
La nouvelle table position :
pour les enregistrements, j'ai mis n'importe quelles valeurs ; il n'y a que les valeurs de la colonne localization qui sont justes : j'ai pris les 3 1e valeurs de la table machine, l'idée étant que pour chaque localization de la table machines on indique des coordonnées dans la table position.
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 CREATE TABLE IF NOT EXISTS `position` ( `pos_id` smallint(6) NOT NULL AUTO_INCREMENT, `positionX` int(11) DEFAULT NULL, `positionY` int(11) DEFAULT NULL, `localization` varchar(30) COLLATE latin1_general_ci DEFAULT NULL, PRIMARY KEY (`pos_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ROW_FORMAT=COMPRESSED AUTO_INCREMENT=9 ; -- -- Dumping data for table `position` -- INSERT INTO `position` (`pos_id`, `positionX`, `positionY`, `localization`) VALUES (1, 10, 10, 'Angouleme-Espagnac'), (2, 20, 20, 'Bourgebus'), (3, 30, 30, 'Grenoble-38EQI');
Je pense qu'il faut créer une vue qui affichera des lignes du type :
machine1 type1 10 10
machine2 type1 20 20
machine3 type2 10 10
machine4 type3 10 10
machine5 type3 30 30
machine6 type2 30 30
etc.
c'est bien ça ? Si oui, je ne vois plus à quoi sert machine_detail...
Je continuerai demain...
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
Si la discussion est résolue, merci de cliquer sur le bouton
Ce matin, j'ai créé une vue :qui semble répondre à mon besoin. Je pense continuer avec cela, mais suis-je dans la bonne voie ?
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part create view machines_view (name,type,positionX,positionY) as select machines.name, serveur_type.type,position.positionX,position.positionY from machines,serveur_type,position where serveur_type.type=machines.type and position.localization=machines.localization
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
Si la discussion est résolue, merci de cliquer sur le bouton
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager