J'ai le tableau suivant:
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
Comment ajouter une contrainte de clé étrangère sur parent_id
? Supposons que les clés étrangères sont activées.
La plupart des exemples supposent que vous créez la table - j'aimerais ajouter la contrainte à une table existante.
sql
sqlite
foreign-keys
ddl
Dane O'Connor
la source
la source
Réponses:
Vous ne pouvez pas.
Bien que la syntaxe SQL-92 pour ajouter une clé étrangère à votre table soit la suivante:
SQLite ne prend pas en charge la
ADD CONSTRAINT
variante de laALTER TABLE
commande ( sqlite.org: fonctionnalités SQL que SQLite n'implémente pas ).Par conséquent, la seule façon d'ajouter une clé étrangère dans sqlite 3.6.1 est la
CREATE TABLE
suivante:Malheureusement, vous devrez enregistrer les données existantes dans une table temporaire, supprimer l'ancienne table, créer la nouvelle table avec la contrainte FK, puis recopier les données à partir de la table temporaire. ( sqlite.org - FAQ: Q11 )
la source
RENAME TO
est l'une des raresALTER TABLE
variantes actuellement prise en charge dans sqlite 3.Vous pouvez ajouter la contrainte si vous modifiez la table et ajoutez la colonne qui utilise la contrainte.
Tout d'abord, créez une table sans le parent_id:
Ensuite, modifiez la table:
la source
Veuillez vérifier https://www.sqlite.org/lang_altertable.html#otheralter
la source
Oui, vous pouvez, sans ajouter de nouvelle colonne. Vous devez faire attention à le faire correctement afin d'éviter de corrompre la base de données, vous devez donc sauvegarder complètement votre base de données avant d'essayer cela.
pour votre exemple spécifique:
ou plus généralement:
Dans tous les cas, vous voudrez probablement d'abord voir quelle est la définition SQL avant d'apporter des modifications:
Si vous utilisez l'approche replace (), vous trouverez peut-être utile, avant de l'exécuter, de tester d'abord votre commande replace () en exécutant:
la source
Si vous utilisez le module complémentaire de Firefox sqlite-manager, vous pouvez effectuer les opérations suivantes:
Au lieu de supprimer et de créer à nouveau la table, on peut simplement la modifier comme ceci.
Dans la zone de texte Colonnes, cliquez avec le bouton droit sur le nom de la dernière colonne répertoriée pour afficher le menu contextuel et sélectionnez Modifier la colonne. Notez que si la dernière colonne de la définition TABLE est la CLÉ PRIMAIRE, il sera alors nécessaire d'ajouter d'abord une nouvelle colonne, puis d'éditer le type de colonne de la nouvelle colonne afin d'ajouter la définition de CLÉ ÉTRANGÈRE. Dans la zone Type de colonne, ajoutez une virgule et le
définition après le type de données. Cliquez sur le bouton Modifier, puis sur le bouton Oui dans la boîte de dialogue Opération dangereuse.
Référence: Sqlite Manager
la source
Vous pouvez essayer ceci:
la source
En gros, vous ne pouvez pas mais vous pouvez contourner la situation.
La manière correcte d'ajouter la contrainte de clé étrangère à une table existante est la commande suivante.
Copiez ensuite les données parent_Id dans le newCol , puis supprimez la colonne Parent_Id . Par conséquent, pas besoin de table temporaire.
la source
Ajoutez d'abord une colonne dans la table enfant
Cid
commeint
puisalter table
avec le code ci-dessous. De cette façon, vous pouvez ajouter la clé étrangèreCid
comme clé primaire de la table parent et l'utiliser comme clé étrangère dans la table enfant ... j'espère que cela vous aidera car c'est bon pour moi:la source