web-dev-qa-db-fra.com

Puis-je modifier une colonne d'une table sqlite en AUTOINCREMENT après sa création?

Puis-je créer un champ AUTOINCREMENT après avoir créé une table? Par exemple, si vous créez une table comme celle-ci:

create table person(id integer primary key, name text);

Plus tard, réalisez qu'il doit incrémenter automatiquement. Comment puis-je le réparer, c'est-à-dire que dans MySQL, vous pouvez faire:

alter table person modify column id integer auto_increment

La création de table est-elle la seule opportunité de faire une colonne AUTOINCREMENT?

27
god

Vous pouvez vider le contenu dans une nouvelle table:

CREATE TABLE failed_banks_id (id integer primary key autoincrement, name text, city text, state text, Zip integer, acquired_by text, close_date date, updated_date date);
INSERT INTO failed_banks_id(name, city, state, Zip, acquired_by,close_date, updated_date)
SELECT name, city, state, Zip, acquired_by,close_date, updated_date
FROM failed_banks;

Et renommez la table:

DROP TABLE failed_banks;
ALTER TABLE failed_banks_id RENAME TO failed_banks;
33
Freeman

Contexte:

La nouvelle clé sera unique sur toutes les clés actuellement dans la table, mais elle peut chevaucher des clés qui ont été précédemment supprimées de la table. Pour créer des clés uniques sur la durée de vie de la table, ajoutez le mot clé AUTOINCREMENT à la déclaration INTEGER PRIMARY KEY.

http://www.sqlite.org/faq.html#q1

Limitations de SQLite:

SQLite prend en charge un sous-ensemble limité de ALTER TABLE. La commande ALTER TABLE dans SQLite permet à l'utilisateur de renommer une table ou d'ajouter une nouvelle colonne à une table existante. Il n'est pas possible de renommer une colonne, de supprimer une colonne ou d'ajouter ou de supprimer des contraintes d'une table.

http://www.sqlite.org/lang_altertable.html

Le hack semble exister:

Il semble que vous pouvez définir

PRAGMA writable_schema = ON;

Effectuez ensuite une MISE À JOUR manuelle de la table sqlite_master pour insérer une "ID INTEGER PRIMARY KEY" dans le SQL pour la définition de la table. Je l'ai essayé et cela semble fonctionner. Mais c'est dangereux. Si vous vous trompez, vous corrompez le fichier de base de données.

http://www.mail-archive.com/[email protected]/msg26987.html

11
alex2k8

De la SQLite Faq

Réponse courte: une colonne déclarée INTEGER PRIMARY KEY sera auto-incrémentée

Ainsi, lorsque vous créez la table, déclarez la colonne comme INTEGER PRIMARY KEY et la colonne sera auto-incrémentée à chaque nouvelle insertion.

Ou vous utilisez l'instruction SQL ALTER pour changer le type de colonne en INTEGER PRIMARY KEY après coup, mais si vous créez les tables vous-même, il est préférable de le faire dans l'instruction de création initiale.

8
Bryan Bailliache

Manière la plus simple - Il suffit d'exporter et de réimporter

C'est possible et relativement facile. Exportez la base de données en tant que fichier sql. Modifiez le fichier SQL et réimportez:

  sqlite3 mydata.db .dump > /tmp/backup.sql
  vi /tmp/backup.sql
  mv mydata.db mydata.db.old
  sqlite3 mydata.db
  sqlite>.read /tmp/backup.sql
5
Jacob

Oui, vous pouvez créer une colonne à incrémentation automatique. Modifiez le tableau et ajoutez une colonne. Gardez à l'esprit qu'il est de type Clé primaire INTEGER.

1
bhejaFry

Alors que le site Sqlite vous donne un exemple comment le faire avec une table avec seulement trois champs, il devient désagréable avec l'un des 30 champs. Étant donné que vous avez une table appelée OldTable avec de nombreux champs, dont le premier est "ID" rempli d'entiers. Faites une copie de votre base de données pour la sauvegarde. En utilisant les commandes dot du programme de commande,

    .output Oldtable.txt
    .dump Oldtable
    Drop Table Oldtable;

Ouvrez Oldtable.txt dans Microsoft Word ou un éditeur de texte de type grep. Recherchez et remplacez vos éléments de champ Entier par NULL (vous devrez peut-être l'ajuster pour l'adapter à vos champs). Modifiez la ligne Créer une table pour que le champ qui a été défini comme Entier soit maintenant INCREMENT AUTOMATIQUE DE LA CLÉ PRIMAIRE ENTIER. Enregistrer sous NewTable.txt

De retour dans le programme de commande dot

   .read NewTable.txt

Terminé. L'ID est désormais auto-incrémenté.

1
user1212108

Vous pouvez le faire avec SQLite Expert Personal 4:

1) Sélectionnez le tableau puis allez dans l'onglet "Conception"> onglet "Colonnes".

2) Cliquez sur "Ajouter" et sélectionnez le nouveau nom de colonne, et tapez INTEGER et Not Null> Ok.

3) Allez dans l'onglet "Clé primaire" dans "Onglet Desgin". Cliquez sur "Ajouter" et sélectionnez la colonne que vous venez de créer. Cochez la case "Autoincrement".

4) Cliquez sur "Appliquer" dans la partie inférieure droite de la fenêtre.

Si vous revenez à l'onglet "Données", vous verrez votre nouvelle colonne avec les numéros générés automatiquement.

1
Tragalunas

Oui Avez-vous installé phpmyadmin? Je crois que si vous allez dans l'onglet "structure" et regardez le long de la colonne de droite (où les types de champs sont répertoriés) - je pense que vous pouvez modifier un paramètre là-bas pour le rendre auto-incrémenté. Il existe également une requête SQL qui fera la même chose.

0
edzillion

vous pouvez modifier la table, modifier la définition de la colonne

0
CodeMonkey1313

Vous ne pouvez pas modifier les colonnes d'une table SQLite après sa création. Vous ne pouvez pas non plus modifier une table pour y ajouter une clé primaire entière.

Vous devez ajouter la clé primaire entière lorsque vous créez la table.

0
Paul Lefebvre