sql >> Database >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

De AUTO_INCREMENT zoekwoord is specifiek voor MySQL.

SQLite heeft een trefwoord AUTOINCREMENT (zonder het onderstrepingsteken), wat betekent dat de kolom automatisch monotoon toenemende waarden genereert die nog nooit eerder in de tabel zijn gebruikt.

Als u de AUTOINCREMENT . weglaat trefwoord (zoals het script dat u op dit moment laat zien), wijst SQLite de ROWID toe aan een nieuwe rij, wat betekent dat het een waarde 1 groter zal zijn dan de huidige hoogste ROWID in de tabel. Dit kan waarden hergebruiken als u rijen aan de bovenkant van de tabel verwijdert en vervolgens nieuwe rijen invoegt.

Zie http://www.sqlite.org/autoinc.html voor meer details.

Als u dit script wilt wijzigen om de AUTOINCREMENT . toe te voegen zoekwoord, het lijkt erop dat u deze regel zou kunnen wijzigen:

gsub( /AUTO_INCREMENT|auto_increment/, "" )

Hierop:

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

Over uw opmerkingen:

Oké, ik heb het op een dummy-tafel geprobeerd met sqlite3.

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

Blijkbaar vereist SQLite dat autoincrement volg een kolomniveau primaire sleutelbeperking. Het is niet blij met de MySQL-conventie om de pk-beperking aan het einde te plaatsen, als een beperking op tabelniveau. Dat wordt ondersteund door de syntaxisdiagrammen in de SQLite documentatie voor CREATE TABLE .

Laten we proberen primary key voor autoincrement .

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

En blijkbaar houdt SQLite niet van "INT", het geeft de voorkeur aan "INTEGER":

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

Succes!

Dus je awk-script is niet in staat om MySQL-tabel DDL zo gemakkelijk in SQLite te vertalen als je dacht.

Over uw opmerkingen:

Je probeert het werk te dupliceren van een Perl-module genaamd SQL::Vertaler , wat veel werk is. Ik ga geen volledig werkend script voor je schrijven.

Om dit echt op te lossen en een script te maken dat alle syntaxiswijzigingen kan automatiseren om de DDL compatibel te maken met SQLite, zou je een volledige parser voor SQL DDL moeten implementeren. Dit is niet praktisch om te doen in awk.

Ik raad je aan om je script voor sommige te gebruiken van de gevallen van trefwoordvervanging, en als verdere wijzigingen nodig zijn, corrigeer deze dan handmatig in een teksteditor.

Overweeg ook om compromissen te sluiten. Als het te moeilijk is om de DDL opnieuw te formatteren om de AUTOINCREMENT . te gebruiken functie in SQLite, overweeg dan of de standaard ROWID-functionaliteit dichtbij genoeg is. Lees de link die ik hierboven heb gepost om de verschillen te begrijpen.



  1. Sequel Pro en MySQL-verbinding mislukt

  2. Voeg een samenvattingsrij toe met totalen

  3. Invoegen ???? in mysql-database bij post vanuit c#-code in Perzische taal

  4. UUID opslaan als string in mysql met behulp van JPA