sql >> Databasteknik >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

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.



  1. Infoga i en mysql-tabell och skriva över alla aktuella data

  2. Mysql - lagrad procedur OUT variabel returnerar null

  3. MYSQL:Gilla metod, liknande ord - men visa inte det sökta ordet

  4. ap_proxy_connect_backend inaktiverar arbetare för (127.0.0.1)