PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

[Débutant] Utilisation des expressions régulières

Technique - général | [Débutant] Utilisation des expressions régulières

Par cioran le 21/07/2007 - 17:39

Bonjour à tous,

Je débute avec postgres, et pour m'entrainer j'essaie de reprendre une base faite avec ms sql server.
J'ai la table Avions créé par l'instruction suivante :

-- création de la table Aéroport
create table Aeroport
(
IdAeroport varchar(3) primary key
CONSTRAINT bon_Id check(IdAeroport like '[a-z][a-z][a-z]' or IdAeroport like '[A-Z][A-Z][A-Z]'),
NomAeroport varchar(50),
NomVilleDesservie varchar(50)
);

Après l'exécution, la table est créé, la contrainte bon_id aussi.
J'essaie maintenant d'insérer un tuple :

insert into Aeroport values('BAS', 'Poretta', 'Bastia');

Et là, il ne veut plus... :(
Message d'erreur :

ERROR: new row for relation "aeroport" violates check constraint "bon_id"
État SQL :23514

Pourtant, l'expression régulière a l'air correcte (je veux accepter que trois caractères, obligatoirement des lettres), et avec ms sql server ça fonctionne très bien...
Pourriez-vous m'expliquer quelle est mon erreur ?

P.S. : Je rappelle aux ceux que j'ai fait sourire avec ma question que je suis un débutant ... :)

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Utilisation des champs

syracine/ = 22 Juillet, 2007 - 11:44

Essaie ta requête comme ceci:
INSERT INTO Aeroport(IdAeroport,NomAeroport,NomVilleDesservie)
VALUES ('BAS','Poretta','Bastia');

Il s'agit d'énumérer les champs utilisés dans ta requête. Ce n'est pas obligatoire, mais par défaut, si tu ne les indiques pas, PostgreSQL utilise l'ordre de création des champs! Alors, ça peut poser problème.

Au niveau de la contrainte, il y a une autre façon de l'écrire.
ALTER TABLE Aeroports
ALTER CONSTRAINT bon_Id CHECK (IdAeroport ILIKE '[a-z]{3}');

L'opérateur ILIKE permet une vérification insensible à la casse. Peut-être que le problème est là.

Autre chose: Si tu prévois utiliser seulement 3 caractères pour ton ID, définie ton champ comme ceci:

IdAeroport char(3)

C'est un détail technique. Char réserve exactement 3 caractères pour ton champ et n'acceptera pas plus de 3 caractères. Si tu définies Varchar(3), ça te permets d'entrer 3 caractères ou plus. PostgreSQL ajoute le caractère 0 à la fin de chaque mot entré pour savoir où il se termine. Ce n'est pas très important pour une petite base, mais quand tu as une grosse base de données, cela demande plus de mémoire!

Bonne chance


Merci pour ta réponse, syrac

cioran/ = 23 Juillet, 2007 - 09:46

Merci pour ta réponse, syracine :)

En effet, c'est plus logique d'utiliser char au lieu de varchar pour le type de données du champ IdAeroport, j'ai fait la modification;

En revanche, le problème d'insertion d'une ligne persiste même avec la nouvelle façon d'écrire la contrainte sur ce champ.

J'ai fait un drop sur toute la base, et j'ai recommencé :

-- création de la base de données
CREATE database AirRoumanie;

-- création de la table Aéroport
create table Aeroport
(
IdAeroport char(3) primary key,
NomAeroport varchar(50),
NomVilleDesservie varchar(50)
);

alter table Aeroport
add constraint bon_Id check(IdAeroport ilike '[a-z]{3}');

-- insertion des tuples dans la table Aéroport
insert into Aeroport(IdAeroport,NomAeroport,NomVilleDesservie) values('BAS', 'Poretta', 'Bastia');

Et j'ai eu la même erreur :
ERROR: new row for relation "aeroport" violates check constraint bon_id"
État SQL :23514

Remarque : si je crée la table sans la contrainte, l'insertion marche très bien, mais je ne peux plus créer la contrainte :
ERROR: check constraint "bon_id" is violated by some row
État SQL :23514

Je ne comprends vraiment pas mon erreur, si quelqu'un peut m'aider, je suis à l'écoute de toute suggestion ... :)


Finalement j'ai trouvé le so

cioran/ = 24 Juillet, 2007 - 10:31

Finalement j'ai trouvé le souci, apparemment LIKE ne s'utilise pas avec des expressions régulières en Postgres, mais en utilisant SIMILAR TO ça fonctionne très bien !!!

Merci syracine pour t'avoir donné la peine de me répondre, c'est très agréable de trouver une réponse quand on est en galère...


migration table ms sql server vers postgresql

radzo/ = 4 Septembre, 2007 - 15:42

Est-ce que vous pourrez me donner l'astuce de cette migration? Quel outil utiliser, ou bien, faut-il réécrire manuellement les tables?

merci beaucoup à tous!


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.