AUTO_INCREMENT
ключовата дума е специфична за MySQL.
SQLite има ключова дума AUTOINCREMENT
(без долното черта), което означава, че колоната автоматично генерира монотонно нарастващи стойности, които никога досега не са били използвани в таблицата.
Ако пропуснете AUTOINCREMENT
ключова дума (както скриптът, който показвате в момента), SQLite присвоява ROWID на нов ред, което означава, че ще бъде стойност 1 по-голяма от текущата най-голяма ROWID в таблицата. Това може да използва повторно стойности, ако изтриете редове от горния край на таблицата и след това вмъкнете нови редове.
Вижте http://www.sqlite.org/autoinc.html за повече подробности.
Ако искате да промените този скрипт, за да добавите AUTOINCREMENT
ключова дума, изглежда, че бихте могли да промените този ред:
gsub( /AUTO_INCREMENT|auto_increment/, "" )
Към това:
gsub( /AUTO_INCREMENT|auto_increment/, "AUTOINCREMENT" )
Отново вашите коментари:
Добре, пробвах го на фиктивна маса, използвайки sqlite3.
sqlite> create table foo (
i int autoincrement,
primary key (i)
);
Error: near "autoincrement": syntax error
Очевидно SQLite изисква това autoincrement
следвайте ниво на колона ограничение на първичния ключ. Не е доволен от конвенцията на MySQL за поставяне на ограничението pk в края, като ограничение на ниво таблица. Това се поддържа от синтаксичните диаграми в SQLite документацията за CREATE TABLE
.
Нека опитаме да поставим primary key
преди autoincrement
.
sqlite> create table foo (
i int primary key autoincrement
);
Error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
И очевидно SQLite не харесва "INT", предпочита "INTEGER":
sqlite> create table foo (
i integer primary key autoincrement
);
sqlite>
Успех!
Така че вашият awk скрипт не е в състояние да преведе MySQL таблицата DDL в SQLite толкова лесно, колкото си мислехте.
Отново вашите коментари:
Опитвате се да дублирате работата на Perl модул, наречен SQL::Преводач , което е много работа. Няма да напиша пълен работещ скрипт вместо вас.
За да разрешите наистина това и да направите скрипт, който може да автоматизира всички промени в синтаксиса, за да направи DDL съвместим със SQLite, ще трябва да внедрите пълен анализатор за SQL DDL. Това не е практично да се прави в awk.
Препоръчвам ви да използвате вашия скрипт за някои от случаите на заместване на ключови думи и след това, ако са необходими допълнителни промени, ги коригирайте на ръка в текстов редактор.
Също така помислете за правене на компромиси. Ако е твърде трудно да преформатирате DDL, за да използвате AUTOINCREMENT
функция в SQLite, помислете дали функционалността по подразбиране ROWID е достатъчно близка. Прочетете връзката, която публикувах по-горе, за да разберете разликите.