O
AUTO_INCREMENT
palavra-chave é específica para MySQL. SQLite tem uma palavra-chave
AUTOINCREMENT
(sem o sublinhado), o que significa que a coluna gera automaticamente valores crescentes monotonicamente que nunca foram usados antes na tabela. Se você deixar de fora o
AUTOINCREMENT
palavra-chave (como o script que você mostra atualmente), o SQLite atribui o ROWID a uma nova linha, o que significa que será um valor 1 maior que o maior ROWID atual na tabela. Isso pode reutilizar valores se você excluir linhas da extremidade superior da tabela e inserir novas linhas. Consulte http://www.sqlite.org/autoinc.html para mais detalhes.
Se você quiser modificar este script para adicionar o
AUTOINCREMENT
palavra-chave, parece que você pode modificar esta linha:gsub( /AUTO_INCREMENT|auto_increment/, "" )
Para isso:
gsub( /AUTO_INCREMENT|auto_increment/, "AUTOINCREMENT" )
Re seus comentários:
Ok, eu tentei em uma tabela fictícia usando sqlite3.
sqlite> create table foo (
i int autoincrement,
primary key (i)
);
Error: near "autoincrement": syntax error
Aparentemente SQLite requer que
autoincrement
siga um nível de coluna restrição de chave primária. Não está satisfeito com a convenção do MySQL de colocar a restrição pk no final, como uma restrição em nível de tabela. Isso é suportado pelos diagramas de sintaxe na documentação SQLite para CREATE TABLE
. Vamos tentar colocar
primary key
antes do autoincrement
. sqlite> create table foo (
i int primary key autoincrement
);
Error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
E aparentemente o SQLite não gosta de "INT", prefere "INTEGER":
sqlite> create table foo (
i integer primary key autoincrement
);
sqlite>
Sucesso!
Portanto, seu script awk não é capaz de traduzir a tabela DDL do MySQL em SQLite tão facilmente quanto você pensou que faria.
Re seus comentários:
Você está tentando duplicar o trabalho de um módulo Perl chamado SQL::Tradutor , o que dá muito trabalho. Eu não vou escrever um roteiro completo de trabalho para você.
Para realmente resolver isso e criar um script que possa automatizar todas as alterações de sintaxe para tornar o DDL compatível com o SQLite, você precisaria implementar um analisador completo para SQL DDL. Isso não é prático para fazer em awk.
Eu recomendo que você use seu script para algumas dos casos de substituição de palavras-chave e, se forem necessárias mais alterações, corrija-as manualmente em um editor de texto.
Considere também fazer concessões. Se for muito difícil reformatar o DDL para usar o
AUTOINCREMENT
recurso no SQLite, considere se a funcionalidade ROWID padrão está próxima o suficiente. Leia o link que postei acima para entender as diferenças.