Autoinkrementacja w SQLite?

0

Witam,
Próbuję w SQLite użyć AUTOINCREMENT, ale ciągle wywala mi błąd i nie wiem za bardzo jaka jest przyczyna.

procedure TForm1.FormCreate(Sender: TObject);
begin
  SQLiteBaza := nil;
  _PATH := ExtractFilePath(Application.ExeName);
  if not FileExists(_PATH + 'baza.dat') then
  begin
    SQLiteBaza := TSQLiteDataBase.Create(_PATH + 'baza.dat');
    SQLIteBaza.ExecSQL('CREATE TABLE test (ID INTEGER PRIMARY KEY AUTOINCREMENT, wykonawca STRING, album STRING, rok VAR, gatunek STRING)');
  end
  else
    SQLiteBaza := TSQLiteDataBase.Create(_PATH + 'baza.dat');
end;   

Później mam taką procedurę, którą wykonuję w OnClicku buttona

procedure TMainForm.AddToDatabase;
Begin
  SQLiteBaza.ExecSQL('INSERT INTO test VALUES("'
  + ArtistEdit.Text + '", "'
  + AlbumEdit.Text + '", "'
  + YearEdit.Text + '", "'
  + GenreBox.Text + '", "'
  + '")');
end;

Wszystko ładnie się zapisuje tylko, że chciałbym, żeby automatycznie uzupełniało mi kolumnę ID. Próbowałem też wpisywać nazwy kolumn po nazwie tabeli, ale wtedy pokazuje, że jest za mało kolumn. To pewnie jakiś prosty problem, ale może ktoś będzie chętny :)

Dodam, że tu w dokumentacji SQLite napisano, że automatycznie powinno dodawać wartość, ale u mnie tego nie robi dlatego chciałem spróbować z AUTOINCREMENT

0

wywal AUTOINCREMENT z deklaracji tabeli

0

Jeżeli używasz INSERT INTO nazwa_tabeli VALUES, wtedy musisz podać wartości dla wszystkich kolumn. Musisz użyć INSERT INTO nazwa_tabeli (kolumna1, kolumna2) VALUES.

Poza tym - sprawdź, jaką wiadomość błędu dostajesz od SQLite.

0
lampasss napisał(a):

wywal AUTOINCREMENT z deklaracji tabeli

Tak zrobiłem na początku. Nie działa.

Sensacyjny Sebastian napisał(a):

Jeżeli używasz INSERT INTO nazwa_tabeli VALUES, wtedy musisz podać wartości dla wszystkich kolumn. Musisz użyć INSERT INTO nazwa_tabeli (kolumna1, kolumna2) VALUES.

Poza tym - sprawdź, jaką wiadomość błędu dostajesz od SQLite.

No ale właśnie chodzi o to, że nie chcę dodawać 1 kolumny. Chcę żeby automatycznie ją numerowało.

screenshot-20191024193610.png

Te bład pojawia się, gdy mam SQLiteBaza.ExecSQL('INSERT INTO tabela (wykonawca, album, rok, gatunek) VALUES("' . Jak usune nazwy kolumn i AUTOINCREMENT to zapisze się wszsytko ładnie jak chcę tylko, że ID nie numeruje się automatycznie, a na tym mi zależy.

1

Przeczytałeś w ogóle tę wiadomość o błędzie?

5 values for 4 columns

Podajesz 4 nazwy kolumn, do których chcesz wstawić wartości, po czym podajesz krotkę z pięcioma wartościami:

  • a
  • a
  • 1
  • ambient
0

podaj zamiast Id -> null lub podaj jakie kolumny podajesz w values.

1

Wprawdzie problem został rozwiązany, ale ja wkleję tutaj fragment z dokumentacji SQLite dotyczący AUTOINCREMENT w kontekście PRIMARY KEY. Pewnie nie każdy się tym interesował, a zrozumienie jak to działa w SQLite może się przydać w przyszłości :)

  • The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed.
  • In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID (except in WITHOUT ROWID tables) which is always a 64-bit signed integer.
  • On an INSERT, if the ROWID or INTEGER PRIMARY KEY column is not explicitly given a value, then it will be filled automatically with an unused integer, usually one more than the largest ROWID currently in use. This is true regardless of whether or not the AUTOINCREMENT keyword is used.
  • If the AUTOINCREMENT keyword appears after INTEGER PRIMARY KEY, that changes the automatic ROWID assignment algorithm to prevent the reuse of ROWIDs over the lifetime of the database. In other words, the purpose of AUTOINCREMENT is to prevent the reuse of ROWIDs from previously deleted rows.

Więcej konkretów dla zainteresowanych - https://www.sqlite.org/autoinc.html
oraz
https://www.sqlite.org/lang_createtable.html#rowid

1 użytkowników online, w tym zalogowanych: 0, gości: 1