Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP i MySQL - jak uniknąć hasła w kodzie źródłowym?

  2. wybierz sumę do określonej kwoty, a następnie zaktualizuj określone pola na podstawie warunku

  3. Django manage.py rzucanie syncdb Brak modułu o nazwie MySQLdb

  4. Python pymySQL wysyłający ciąg znaków z cudzysłowami

  5. Django- Jak mapować wiadomości wysyłane między użytkownikami