sql >> Databáze >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

AUTO_INCREMENT klíčové slovo je specifické pro MySQL.

SQLite má klíčové slovo AUTOINCREMENT (bez podtržítka), což znamená, že sloupec automaticky generuje monotónně rostoucí hodnoty, které v tabulce ještě nebyly nikdy použity.

Pokud vynecháte AUTOINCREMENT klíčové slovo (jak to aktuálně dělá skript, který zobrazujete), SQLite přiřadí ROWID novému řádku, což znamená, že bude mít hodnotu o 1 větší než aktuální největší ROWID v tabulce. To by mohlo znovu použít hodnoty, pokud odstraníte řádky z horní části tabulky a poté vložíte nové řádky.

Viz http://www.sqlite.org/autoinc.html pro více podrobností.

Pokud chcete tento skript upravit tak, aby přidal AUTOINCREMENT klíčové slovo, vypadá to, že byste mohli upravit tento řádek:

gsub( /AUTO_INCREMENT|auto_increment/, "" )

K tomu:

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

K vašim komentářům:

Dobře, zkusil jsem to na fiktivní tabulce pomocí sqlite3.

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

SQLite zjevně vyžaduje tento autoincrement postupujte podle úrovně sloupce omezení primárního klíče. Není spokojen s konvencí MySQL umístit omezení pk na konec jako omezení na úrovni tabulky. To podporují syntaktické diagramy v dokumentaci pro CREATE TABLE SQLite .

Zkusme vložit primary key před autoincrement .

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

A zjevně SQLite nemá rád "INT", preferuje "INTEGER":

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

Úspěch!

Takže váš awk skript není schopen přeložit MySQL tabulku DDL do SQLite tak snadno, jak jste si mysleli.

K vašim komentářům:

Pokoušíte se duplikovat práci modulu Perl s názvem SQL::Translator , což je hodně práce. Nebudu pro vás psát úplný pracovní skript.

Abyste to skutečně vyřešili a vytvořili skript, který dokáže automatizovat všechny změny syntaxe, aby byl DDL kompatibilní s SQLite, museli byste implementovat úplný parser pro SQL DDL. To není praktické v awk.

Doporučuji vám použít váš skript pro některé případů substituce klíčových slov, a pokud jsou nutné další změny, opravte je ručně v textovém editoru.

Zvažte také kompromisy. Pokud je příliš obtížné přeformátovat DDL na použití AUTOINCREMENT funkce v SQLite, zvažte, zda je výchozí funkce ROWID dostatečně blízko. Přečtěte si odkaz, který jsem zveřejnil výše, abyste pochopili rozdíly.



  1. mysql, výpis, obnovení databáze

  2. Jak mohu omezit velikost dočasných tabulek?

  3. Jak zapsat do databáze více autorů v jednoduché tabulce knih?

  4. Tabulka je „pouze pro čtení“