sql >> Database teknologi >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

AUTO_INCREMENT søgeord er specifikt for MySQL.

SQLite har et nøgleord AUTOINCREMENT (uden understregning), hvilket betyder, at kolonnen automatisk genererer monotont stigende værdier, som aldrig har været brugt før i tabellen.

Hvis du udelader AUTOINCREMENT nøgleordet (som det script, du viser i øjeblikket), tildeler SQLite ROWID til en ny række, hvilket betyder, at det vil være en værdi 1 større end den nuværende største ROWID i tabellen. Dette kan genbruge værdier, hvis du sletter rækker fra den høje ende af tabellen og derefter indsætter nye rækker.

Se http://www.sqlite.org/autoinc.html for flere detaljer.

Hvis du vil ændre dette script for at tilføje AUTOINCREMENT søgeord, ser det ud til, at du kan ændre denne linje:

gsub( /AUTO_INCREMENT|auto_increment/, "" )

Til dette:

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

Vedrørende dine kommentarer:

Okay, jeg prøvede det på et dummy-bord ved hjælp af sqlite3.

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

Tilsyneladende kræver SQLite denne autoincrement følg et kolonneniveau primær nøglebegrænsning. Det er ikke tilfreds med MySQL-konventionen om at sætte pk-begrænsningen til sidst, som en begrænsning på tabelniveau. Det understøttes af syntaksdiagrammerne i SQLite dokumentationen til CREATE TABLE .

Lad os prøve at sætte primary key før autoincrement .

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

Og tilsyneladende kan SQLite ikke lide "INT", den foretrækker "INTEGER":

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

Succes!

Så dit awk-script er ikke i stand til at oversætte MySQL-tabel DDL til SQLite så let, som du troede det ville.

Vedrørende dine kommentarer:

Du forsøger at duplikere arbejdet i et Perl-modul kaldet SQL::Oversætter , hvilket er meget arbejde. Jeg har ikke tænkt mig at skrive et komplet arbejdsmanuskript til dig.

For virkelig at løse dette og lave et script, der kan automatisere alle syntaksændringer for at gøre DDL kompatibel med SQLite, skal du implementere en fuld parser til SQL DDL. Dette er ikke praktisk at gøre i awk.

Jeg anbefaler, at du bruger dit script til nogle af tilfældene med søgeordserstatning, og hvis yderligere ændringer er nødvendige, skal du rette dem manuelt i en teksteditor.

Overvej også at indgå kompromiser. Hvis det er for svært at omformatere DDL til at bruge AUTOINCREMENT funktion i SQLite, overvej om standard ROWID-funktionaliteten er tæt nok på. Læs linket jeg postede ovenfor for at forstå forskellene.



  1. Brug MySQL Relational Databases på Ubuntu 10.04 LTS (Lucid)

  2. Konverter 'datetime2' til 'smalldatetime' i SQL Server (T-SQL-eksempler)

  3. Hvordan kører man desktop-applikation med database lokalt uden at installere nogen databaseserver?

  4. Hvordan kan jeg kontrollere, om datointerval eksisterer