Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

Der AUTO_INCREMENT Schlüsselwort ist spezifisch für MySQL.

SQLite hat ein Schlüsselwort AUTOINCREMENT (ohne den Unterstrich), was bedeutet, dass die Spalte automatisch monoton ansteigende Werte generiert, die noch nie zuvor in der Tabelle verwendet wurden.

Wenn Sie das AUTOINCREMENT weglassen Schlüsselwort (wie es das von Ihnen gezeigte Skript derzeit tut), weist SQLite die ROWID einer neuen Zeile zu, was bedeutet, dass sie einen Wert hat, der um 1 größer ist als die aktuell größte ROWID in der Tabelle. Dies könnte Werte wiederverwenden, wenn Sie Zeilen am oberen Ende der Tabelle löschen und dann neue Zeilen einfügen.

Siehe http://www.sqlite.org/autoinc.html für weitere Details.

Wenn Sie dieses Skript ändern möchten, um das AUTOINCREMENT hinzuzufügen Schlüsselwort, sieht es so aus, als könnten Sie diese Zeile ändern:

gsub( /AUTO_INCREMENT|auto_increment/, "" )

Dazu:

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

Zu Ihren Kommentaren:

Okay, ich habe es auf einer Dummy-Tabelle mit sqlite3 versucht.

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

Anscheinend erfordert SQLite dieses autoincrement folgen Sie einer Spaltenebene Primärschlüsseleinschränkung. Es ist nicht glücklich mit der MySQL-Konvention, die pk-Einschränkung als Einschränkung auf Tabellenebene an das Ende zu stellen. Dies wird durch die Syntaxdiagramme in der SQLite Dokumentation für CREATE TABLE unterstützt .

Lassen Sie uns versuchen, primary key einzusetzen vor autoincrement .

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

Und anscheinend mag SQLite "INT" nicht, es bevorzugt "INTEGER":

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

Erfolg!

Ihr awk-Skript ist also nicht in der Lage, MySQL-Tabellen-DDL so einfach in SQLite zu übersetzen, wie Sie es sich vorgestellt haben.

Zu Ihren Kommentaren:

Sie versuchen, die Arbeit eines Perl-Moduls namens SQL::Translator , was eine Menge Arbeit ist. Ich werde kein voll funktionsfähiges Skript für Sie schreiben.

Um dies wirklich zu lösen und ein Skript zu erstellen, das alle Syntaxänderungen automatisieren kann, um die DDL mit SQLite kompatibel zu machen, müssten Sie einen vollständigen Parser für SQL DDL implementieren. Dies ist in awk nicht praktikabel.

Ich empfehle Ihnen, Ihr Skript für einige zu verwenden der Fälle von Keyword-Ersetzungen, und wenn weitere Änderungen notwendig sind, korrigieren Sie sie von Hand in einem Texteditor.

Erwägen Sie auch, Kompromisse einzugehen. Wenn es zu schwierig ist, die DDL neu zu formatieren, verwenden Sie AUTOINCREMENT Funktion in SQLite, überlegen Sie, ob die standardmäßige ROWID-Funktionalität nahe genug ist. Lesen Sie den Link, den ich oben gepostet habe, um die Unterschiede zu verstehen.