Je passe de MySQL à PostgreSQL et je me demandais comment je peux faire des valeurs d'auto-incrémentation. J'ai vu dans les documents PostgreSQL un type de données "série", mais j'obtiens des erreurs de syntaxe lors de son utilisation (en v8.0).
579
Réponses:
Oui, SERIAL est la fonction équivalente.
SERIAL est juste une macro de création d'heure de table autour de séquences. Vous ne pouvez pas modifier SERIAL sur une colonne existante.
la source
"Table"
,"table"
puis ne la laissez pas entre guillemets et canonisez-latable
. La convention est simplement de ne jamais utiliser de guillemets dans Pg. Vous pouvez, si vous le souhaitez, utiliser des noms de casse mixtes pour l'apparence, mais ne l'exigez pas:CREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
cela fonctionnera, tout commeSELECT * FROM foobar
.Vous pouvez utiliser tout autre type de données entier , tel que
smallint
.Exemple :
Mieux vaut utiliser votre propre type de données plutôt que le type de données série utilisateur .
la source
CREATE SEQUENCE
postgresql.org/docs/8.1/interactive/sql-createsequence.html ) . CEPENDANT, je ne sais pas trop pourquoi vous avez changé de propriétaire.Si vous souhaitez ajouter une séquence à id dans le tableau qui existe déjà, vous pouvez utiliser:
la source
ALTER COLUMN user_id
?ERROR: syntax error at or near "DEFAULT"
suggestions?Bien qu'il semble que les séquences soient l' équivalent de l'auto-incrémentation de MySQL, il existe quelques différences subtiles mais importantes:
1. Échec des requêtes Incrémenter la séquence / série
La colonne série est incrémentée en cas d'échec des requêtes. Cela entraîne une fragmentation des requêtes ayant échoué, et pas seulement des suppressions de lignes. Par exemple, exécutez les requêtes suivantes sur votre base de données PostgreSQL:
Vous devriez obtenir la sortie suivante:
Remarquez comment l'uid passe de 1 à 3 au lieu de 1 à 2.
Cela se produit toujours si vous deviez créer manuellement votre propre séquence avec:
Si vous souhaitez tester en quoi MySQL est différent, exécutez ce qui suit sur une base de données MySQL:
Vous devriez obtenir ce qui suit sans frustration :
2. La définition manuelle de la valeur de la colonne série peut entraîner l'échec des requêtes futures.
Cela a été souligné par @trev dans une réponse précédente.
Pour simuler cela, définissez manuellement l'uid sur 4 qui "se heurtera" plus tard.
Données du tableau:
Exécutez un autre insert:
Données du tableau:
Maintenant, si vous exécutez une autre insertion:
Il échouera avec le message d'erreur suivant:
En revanche, MySQL gérera cela avec élégance comme indiqué ci-dessous:
Insérez maintenant une autre ligne sans définir d'uid
La requête n'échoue pas, uid passe simplement à 5:
Les tests ont été effectués sur MySQL 5.6.33, pour Linux (x86_64) et PostgreSQL 9.4.9
la source
À partir de Postgres 10, les colonnes d'identité définies par la norme SQL sont également prises en charge:
crée une colonne d'identité qui ne peut pas être remplacée sauf demande explicite. L'insertion suivante échouera avec une colonne définie comme
generated always
:Cela peut cependant être annulé:
Lorsque vous utilisez l'option,
generated by default
c'est essentiellement le même comportement que l'serial
implémentation existante :Lorsqu'une valeur est fournie manuellement, la séquence sous-jacente doit également être ajustée manuellement - la même chose qu'avec une
serial
colonne.Une colonne d'identité n'est pas une clé primaire par défaut (tout comme une
serial
colonne). S'il doit en être un, une contrainte de clé primaire doit être définie manuellement.la source
Désolé de reformuler une vieille question, mais ce fut la première question / réponse Stack Overflow apparue sur Google.
Cet article (qui est apparu en premier sur Google) parle de l'utilisation de la syntaxe la plus mise à jour pour PostgreSQL 10: https://blog.2ndquadrant.com/postgresql-10-identity-columns/
qui se trouve être:
J'espère que cela pourra aider :)
la source
GENERATED … AS IDENTITY
commandes sont du SQL standard. D'abord ajouté dans SQL: 2003 , puis clarifié dans SQL: 2008 . Voir caractéristiques # T174 & F386 & T178.Vous devez faire attention à ne pas insérer directement dans votre champ SERIAL ou séquence, sinon votre écriture échouera lorsque la séquence atteindra la valeur insérée:
la source
Dans le cadre de la question posée et en réponse au commentaire de @ sereja1c, créer
SERIAL
implicitement crée des séquences, donc pour l'exemple ci-dessus-CREATE TABLE
créerait implicitement une séquencefoo_id_seq
pour la colonne sériefoo.id
. Par conséquent,SERIAL
[4 octets] est bon pour sa facilité d'utilisation, sauf si vous avez besoin d'un type de données spécifique pour votre identifiant.la source
Cette méthode fonctionnera à coup sûr, j'espère que cela aidera:
Vous pouvez vérifier ces détails dans le lien suivant: http://www.postgresqltutorial.com/postgresql-serial/
la source
Depuis PostgreSQL 10
la source