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

mysql2sqlite.sh Incremento_automatico

Il AUTO_INCREMENT la parola chiave è specifica per MySQL.

SQLite ha una parola chiave AUTOINCREMENT (senza il carattere di sottolineatura), il che significa che la colonna genera automaticamente valori che aumentano in modo monotono che non sono mai stati utilizzati prima nella tabella.

Se ometti AUTOINCREMENT parola chiave (come lo script che mostri attualmente), SQLite assegna il ROWID a una nuova riga, il che significa che sarà un valore maggiore di 1 rispetto al ROWID massimo corrente nella tabella. Ciò potrebbe riutilizzare i valori se elimini le righe dall'estremità superiore della tabella e quindi inserisci nuove righe.

Vedi http://www.sqlite.org/autoinc.html per maggiori dettagli.

Se vuoi modificare questo script per aggiungere il AUTOINCREMENT parola chiave, sembra che tu possa modificare questa riga:

gsub( /AUTO_INCREMENT|auto_increment/, "" )

A questo:

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

Re i tuoi commenti:

Ok, l'ho provato su un tavolo fittizio usando sqlite3.

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

Apparentemente SQLite richiede che autoincrement segui un livello di colonna vincolo della chiave primaria. Non è soddisfatto della convenzione MySQL di mettere il vincolo pk alla fine, come vincolo a livello di tabella. Ciò è supportato dai diagrammi di sintassi nella documentazione per CREATE TABLE di SQLite .

Proviamo a inserire primary key prima di autoincrement .

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

E apparentemente a SQLite non piace "INT", preferisce "INTEGER":

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

Successo!

Quindi il tuo script awk non è in grado di tradurre la tabella MySQL DDL in SQLite facilmente come pensavi.

Re i tuoi commenti:

Stai cercando di duplicare il lavoro di un modulo Perl chiamato SQL::Traduttore , che è un sacco di lavoro. Non scriverò per te uno script funzionante completo.

Per risolvere davvero questo problema e creare uno script in grado di automatizzare tutte le modifiche alla sintassi per rendere il DDL compatibile con SQLite, è necessario implementare un parser completo per SQL DDL. Questo non è pratico da fare in awk.

Ti consiglio di utilizzare il tuo script per alcuni dei casi di sostituzione delle parole chiave, e poi, se sono necessarie ulteriori modifiche, correggerle manualmente in un editor di testo.

Considera anche di scendere a compromessi. Se è troppo difficile riformattare il DDL per utilizzare AUTOINCREMENT funzionalità in SQLite, considera se la funzionalità ROWID predefinita è sufficientemente vicina. Leggi il link che ho postato sopra per capire le differenze.