J'ai créé une table dans Sqlite en utilisant la CREATE TABLE AS
syntaxe pour créer une table basée sur une SELECT
instruction. Maintenant, cette table n'a pas de clé primaire mais j'aimerais en ajouter une.
L'exécution ALTER TABLE table_name ADD PRIMARY KEY(col1, col2,...)
donne une erreur de syntaxe "proche du PRIMAIRE"
Existe-t-il un moyen d'ajouter une clé primaire lors de la création de la table ou après dans Sqlite?
Par "pendant la création", je veux dire pendant la création avec CREATE TABLE AS
.
Réponses:
Vous ne pouvez pas modifier les tables SQLite de manière significative après leur création. La solution suggérée acceptée consiste à créer une nouvelle table avec les exigences correctes et à y copier vos données, puis à supprimer l'ancienne table.
voici la documentation officielle à ce sujet: http://sqlite.org/faq.html#q11
la source
CREATE UNIQUE INDEX pkName ON tableName(columnName)
) lorsque les cadres DB comme MS SQL de SMO réellement faire vous ajoutez un PK après la table a été créé!Tant que vous utilisez
CREATE TABLE
, si vous créez la clé primaire sur un seul champ , vous pouvez utiliser:Avec
CREATE TABLE
, vous pouvez également toujours utiliser l'approche suivante pour créer une clé primaire sur un ou plusieurs champs :Référence: http://www.sqlite.org/lang_createtable.html
Cette réponse ne traite pas de la modification des tables.
la source
J'ai essayé d'ajouter la clé primaire par la suite en changeant directement la table sqlite_master. Cette astuce semble fonctionner. C'est une solution de piratage bien sûr.
En bref: créez un index régulier (unique) sur la table, puis rendez le schéma inscriptible et changez le nom de l'index sous la forme réservée par sqlite pour identifier un index de clé primaire, (ie sqlite_autoindex_XXX_1, où XXX est le nom de la table) et définissez la chaîne sql sur NULL. Modifiez enfin la définition de la table elle-même. Un pittfal: sqlite ne voit pas le nom de l'index changer jusqu'à ce que la base de données soit rouverte. Cela semble être un bogue, mais pas grave (même sans rouvrir la base de données, vous pouvez toujours l'utiliser).
Supposons que le tableau ressemble à:
Ensuite, j'ai fait ce qui suit:
Quelques tests (en shell sqlite):
la source
Selon la documentation de sqlite sur la création de table, l'utilisation de la table create comme select produit une nouvelle table sans contraintes et sans clé primaire.
Cependant, la documentation indique également que les clés primaires et les index uniques sont logiquement équivalents ( voir la section sur les contraintes ):
Ainsi, même si vous ne pouvez pas modifier la définition de votre table via la syntaxe SQL alter, vous pouvez obtenir le même effet de clé primaire en utilisant un index unique.
De plus, toutes les tables (sauf celles créées sans la syntaxe rowid) ont une colonne entière interne appelée "rowid". Selon la documentation, vous pouvez utiliser cette colonne interne pour récupérer / modifier les tables d'enregistrement.
la source
Vous pouvez le faire comme ceci:
la source
introduction
Ceci est basé sur le java d'Android et c'est un bon exemple pour changer la base de données sans ennuyer les fans / clients de votre application. Ceci est basé sur l'idée de la page FAQ SQLite http://sqlite.org/faq.html#q11
Le problème
Je n'ai pas remarqué que je devais définir un row_number ou record_id pour supprimer un seul article acheté dans un reçu, et en même temps, le numéro de code à barres de l'article m'a trompé en pensant en faire la clé pour supprimer cet article. J'enregistre les détails d'un reçu dans la table reception_barcode. Le laisser sans record_id peut signifier la suppression de tous les enregistrements du même article dans un reçu si j'ai utilisé le code-barres de l'article comme clé.
Remarquer
Veuillez comprendre qu'il s'agit d'un copier-coller de mon code sur lequel je travaille au moment d'écrire ces lignes. Utilisez-le uniquement à titre d'exemple, le copier-coller au hasard ne vous aidera pas. Modifiez-le d'abord selon vos besoins
N'oubliez pas non plus de lire les commentaires dans le code.
Le code
Utilisez-le comme méthode dans votre classe pour vérifier d'abord si la colonne que vous souhaitez ajouter est manquante. Nous faisons cela juste pour ne pas répéter le processus de modification de la table reception_barcode. Mentionnez-le simplement dans le cadre de votre cours. Dans l'étape suivante, vous verrez comment nous l'utiliserons.
Ensuite, le code suivant est utilisé pour créer la table receipt_barcode si elle ne déjà pas sortir pour les 1ers utilisateurs de temps de votre application. Et s'il vous plaît noter le "SI PAS EXISTANT" dans le code. Cela a de l'importance.
la source
J'ai eu le même problème et la meilleure solution que j'ai trouvée est de créer d'abord la table définissant la clé primaire, puis d'utiliser l'insertion dans l'instruction.
la source
J'ai utilisé la syntaxe CREATE TABLE AS pour fusionner plusieurs colonnes et j'ai rencontré le même problème. Voici un AppleScript que j'ai écrit pour accélérer le processus.
la source
Je pense que l'ajout d'un index sur cette colonne peut obtenir à peu près le même effet.
la source
la source
Utilisez un outil comme DB Browser pour SQLite, il permet d'ajouter PK, AI par simple clic droit sur la table -> modifier.
la source