Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment


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.