AUTO_INCREMENT
słowo kluczowe jest specyficzne dla MySQL.
SQLite zawiera słowo kluczowe AUTOINCREMENT
(bez podkreślenia), co oznacza, że kolumna automatycznie generuje monotonicznie rosnące wartości, które nigdy wcześniej nie były używane w tabeli.
Jeśli pominiesz AUTOINCREMENT
słowo kluczowe (tak jak obecnie pokazuje skrypt), SQLite przypisuje ROWID do nowego wiersza, co oznacza, że będzie to wartość o 1 większa niż bieżący największy ROWID w tabeli. Może to ponownie wykorzystać wartości, jeśli usuniesz wiersze z górnego końca tabeli, a następnie wstawisz nowe wiersze.
Zobacz http://www.sqlite.org/autoinc.html po więcej szczegółów.
Jeśli chcesz zmodyfikować ten skrypt, aby dodać AUTOINCREMENT
słowo kluczowe, wygląda na to, że możesz zmodyfikować ten wiersz:
gsub( /AUTO_INCREMENT|auto_increment/, "" )
Do tego:
gsub( /AUTO_INCREMENT|auto_increment/, "AUTOINCREMENT" )
Odpowiedz na swoje komentarze:
Dobra, wypróbowałem to na obojętnym stole za pomocą sqlite3.
sqlite> create table foo (
i int autoincrement,
primary key (i)
);
Error: near "autoincrement": syntax error
Najwyraźniej SQLite wymaga autoincrement
obserwuj poziom kolumny ograniczenie klucza podstawowego. Nie jest zadowolony z konwencji MySQL polegającej na umieszczaniu ograniczenia pk na końcu, jako ograniczenia na poziomie tabeli. Jest to obsługiwane przez diagramy składni w dokumentacji SQLite dla CREATE TABLE
.
Spróbujmy umieścić primary key
przed autoincrement
.
sqlite> create table foo (
i int primary key autoincrement
);
Error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
I najwyraźniej SQLite nie lubi "INT", woli "INTEGER":
sqlite> create table foo (
i integer primary key autoincrement
);
sqlite>
Sukces!
Więc twój skrypt awk nie jest w stanie przetłumaczyć DDL tabeli MySQL na SQLite tak łatwo, jak się spodziewałeś.
Odpowiedz na swoje komentarze:
Próbujesz zduplikować pracę modułu Perla o nazwie SQL::Translator , co jest bardzo pracochłonne. Nie napiszę dla ciebie pełnego działającego skryptu.
Aby naprawdę rozwiązać ten problem i stworzyć skrypt, który może zautomatyzować wszystkie zmiany składni, aby DDL był kompatybilny z SQLite, musiałbyś zaimplementować pełny parser dla SQL DDL. Nie jest to praktyczne w awk.
Zalecam użycie skryptu dla niektórych przypadków zastępowania słów kluczowych, a jeśli konieczne są dalsze zmiany, popraw je ręcznie w edytorze tekstu.
Zastanów się także nad kompromisami. Jeśli ponowne sformatowanie DDL jest zbyt trudne, aby użyć AUTOINCREMENT
w SQLite, zastanów się, czy domyślna funkcjonalność ROWID jest wystarczająco zbliżona. Przeczytaj link, który zamieściłem powyżej, aby zrozumieć różnice.