sql >> Base de Datos >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Incremento

El AUTO_INCREMENT la palabra clave es específica de MySQL.

SQLite tiene una palabra clave AUTOINCREMENT (sin el guión bajo) lo que significa que la columna genera automáticamente valores crecientes monótonamente que nunca antes se han usado en la tabla.

Si omite el AUTOINCREMENT palabra clave (como lo hace actualmente la secuencia de comandos que muestra), SQLite asigna el ROWID a una nueva fila, lo que significa que será un valor 1 mayor que el ROWID más grande actual en la tabla. Esto podría reutilizar valores si elimina filas del extremo superior de la tabla y luego inserta filas nuevas.

Consulte http://www.sqlite.org/autoinc.html para más detalles.

Si desea modificar este script para agregar el AUTOINCREMENT palabra clave, parece que podría modificar esta línea:

gsub( /AUTO_INCREMENT|auto_increment/, "" )

A esto:

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

Re sus comentarios:

De acuerdo, lo probé en una tabla ficticia usando sqlite3.

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

Aparentemente, SQLite requiere que autoincrement seguir un nivel de columna restricción de clave principal. No está satisfecho con la convención de MySQL de colocar la restricción pk al final, como una restricción a nivel de tabla. Eso está respaldado por los diagramas de sintaxis en SQLite documentación para CREATE TABLE .

Intentemos poner primary key antes de autoincrement .

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

Y aparentemente a SQLite no le gusta "INT", prefiere "INTEGER":

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

¡Éxito!

Por lo tanto, su secuencia de comandos awk no puede traducir la tabla DDL de MySQL a SQLite tan fácilmente como pensaba.

Re sus comentarios:

Está intentando duplicar el trabajo de un módulo Perl llamado SQL::Traductor , que es mucho trabajo. No voy a escribir un guión de trabajo completo para ti.

Para resolver realmente esto y crear una secuencia de comandos que pueda automatizar todos los cambios de sintaxis para que el DDL sea compatible con SQLite, debe implementar un analizador completo para SQL DDL. Esto no es práctico de hacer en awk.

Te recomiendo que uses tu script para algunos de los casos de sustitución de palabras clave y luego, si son necesarios más cambios, arréglelos a mano en un editor de texto.

También considere hacer concesiones. Si es demasiado difícil reformatear el DDL para usar AUTOINCREMENT característica en SQLite, considere si la funcionalidad ROWID predeterminada es lo suficientemente cercana. Lea el enlace que publiqué anteriormente para comprender las diferencias.