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.