Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

Le AUTO_INCREMENT mot-clé est spécifique à MySQL.

SQLite a un mot clé AUTOINCREMENT (sans le trait de soulignement) ce qui signifie que la colonne génère automatiquement des valeurs croissantes de manière monotone qui n'ont jamais été utilisées auparavant dans le tableau.

Si vous omettez le AUTOINCREMENT mot-clé (comme le fait actuellement le script que vous montrez), SQLite attribue le ROWID à une nouvelle ligne, ce qui signifie qu'il sera supérieur de 1 au plus grand ROWID actuel de la table. Cela pourrait réutiliser des valeurs si vous supprimez des lignes du haut du tableau, puis insérez de nouvelles lignes.

Voir http://www.sqlite.org/autoinc.html pour plus de détails.

Si vous souhaitez modifier ce script pour ajouter l'AUTOINCREMENT mot-clé, il semble que vous pourriez modifier cette ligne :

gsub( /AUTO_INCREMENT|auto_increment/, "" )

À ceci :

gsub( /AUTO_INCREMENT|auto_increment/, "AUTOINCREMENT" )

Vos commentaires :

Ok, je l'ai essayé sur une table factice en utilisant sqlite3.

sqlite> create table foo ( 
  i int autoincrement, 
  primary key (i)
);
Error: near "autoincrement": syntax error

Apparemment, SQLite nécessite cette autoincrement suivre un niveau colonne contrainte de clé primaire. Il n'est pas satisfait de la convention MySQL consistant à placer la contrainte pk à la fin, en tant que contrainte au niveau de la table. Cela est pris en charge par les diagrammes de syntaxe dans la documentation SQLite pour CREATE TABLE .

Essayons de mettre primary key avant autoincrement .

sqlite> create table foo ( 
  i int primary key autoincrement
);
Error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY

Et apparemment SQLite n'aime pas "INT", il préfère "INTEGER":

sqlite> create table foo (
  i integer primary key autoincrement
);
sqlite>

Succès !

Votre script awk n'est donc pas capable de traduire la table MySQL DDL en SQLite aussi facilement que vous le pensiez.

Vos commentaires :

Vous essayez de dupliquer le travail d'un module Perl appelé SQL::Traducteur , ce qui représente beaucoup de travail. Je ne vais pas écrire un script de travail complet pour vous.

Pour vraiment résoudre ce problème et créer un script capable d'automatiser toutes les modifications de syntaxe afin de rendre le DDL compatible avec SQLite, vous devez implémenter un analyseur complet pour SQL DDL. Ce n'est pas pratique à faire dans awk.

Je vous recommande d'utiliser votre script pour certains des cas de substitution de mots clés, puis si d'autres modifications sont nécessaires, corrigez-les à la main dans un éditeur de texte.

Pensez également à faire des compromis. S'il est trop difficile de reformater le DDL pour utiliser l'AUTOINCREMENT fonctionnalité dans SQLite, déterminez si la fonctionnalité ROWID par défaut est suffisamment proche. Lisez le lien que j'ai posté ci-dessus pour comprendre les différences.