AUTO_INCREMENT
nyckelordet är specifikt för MySQL.
SQLite har nyckelordet AUTOINCREMENT
(utan understreck) vilket betyder att kolumnen automatiskt genererar monotont ökande värden som aldrig tidigare har använts i tabellen.
Om du utelämnar AUTOINCREMENT
nyckelord (som skriptet du visar gör för närvarande), tilldelar SQLite ROWID till en ny rad, vilket betyder att det kommer att vara ett värde 1 större än den nuvarande största ROWID i tabellen. Detta kan återanvända värden om du tar bort rader från den övre delen av tabellen och sedan infogar nya rader.
Se http://www.sqlite.org/autoinc.html för mer information.
Om du vill ändra detta skript för att lägga till AUTOINCREMENT
sökord, ser det ut som att du kan ändra den här raden:
gsub( /AUTO_INCREMENT|auto_increment/, "" )
Till detta:
gsub( /AUTO_INCREMENT|auto_increment/, "AUTOINCREMENT" )
Angående dina kommentarer:
Okej, jag provade det på ett dummybord med sqlite3.
sqlite> create table foo (
i int autoincrement,
primary key (i)
);
Error: near "autoincrement": syntax error
Tydligen kräver SQLite den autoincrement
följ en kolumnnivå primär nyckelbegränsning. Det är inte nöjd med MySQL-konventionen att sätta pk-begränsningen i slutet, som en begränsning på tabellnivå. Det stöds av syntaxdiagrammen i SQLite dokumentationen för CREATE TABLE
.
Låt oss försöka sätta primary key
före autoincrement
.
sqlite> create table foo (
i int primary key autoincrement
);
Error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
Och tydligen gillar SQLite inte "INT", den föredrar "INTEGER":
sqlite> create table foo (
i integer primary key autoincrement
);
sqlite>
Framgång!
Så ditt awk-skript kan inte översätta MySQL-tabell DDL till SQLite så enkelt som du trodde det skulle göra.
Angående dina kommentarer:
Du försöker duplicera arbetet med en Perl-modul som heter SQL::Översättare , vilket är mycket jobb. Jag tänker inte skriva ett fullständigt arbetsmanus åt dig.
För att verkligen lösa detta, och göra ett skript som kan automatisera alla syntaxändringar för att göra DDL kompatibel med SQLite, skulle du behöva implementera en fullständig parser för SQL DDL. Detta är inte praktiskt att göra i awk.
Jag rekommenderar att du använder ditt skript för vissa av fallen med sökordsersättning, och om ytterligare ändringar är nödvändiga, fixa dem för hand i en textredigerare.
Överväg också att göra kompromisser. Om det är för svårt att formatera om DDL för att använda AUTOINCREMENT
funktionen i SQLite, överväg om standard ROWID-funktionaliteten är tillräckligt nära. Läs länken jag postade ovan för att förstå skillnaderna.