Jak utworzyć klucz główny, który NIE inkrementuje się sam

0

Witam,
używam silnika SQLite i mam taką oto tabelkę:

CREATE TABLE tab (
id INTEGER PRIMARY KEY NOT NULL
);

Gdy nie podam wartości dla id lub gdy podam NULL to SQLite samo wstawia odpowiednią wartość:
INSERT INTO tab(id) VALUES(NULL);

Czy da się, jeśli tak to jak zrobić aby SQLite w żadnym wypadku nie wstawiał własnej wartości do id, gdy nie wpisuję tej wartości explicite?

0

PRIMARY KEY implikuje NOT NULL i UNIQUE. Może Ty po prostu nie chcesz żeby to był primary key?

0
mychal.szczygiel napisał(a)

PRIMARY KEY implikuje NOT NULL i UNIQUE. Może Ty po prostu nie chcesz żeby to był primary key?

Właściwie atrybut 'id' ma się odnosić do innej tabeli - ma być to klucz obcy. Jednak chciałbym aby był równocześnie kluczem głównym.

0

:D Wiesz co? Chyba będzie lepiej jak opiszesz swój problem od początku i skupisz się na tym co chcesz osiągnąć :P

0
mychal.szczygiel napisał(a)

:D Wiesz co? Chyba będzie lepiej jak opiszesz swój problem od początku i skupisz się na tym co chcesz osiągnąć :P

Ok, po pierwsze NOT NULL przy PRIMARY KEY ma znaczenie, przynajmniej w SQLite.

Chce stworzyć taką tabelę:

CREATE TABLE user_comment (
      user_id INTEGER PRIMARY KEY NOT NULL,
      note TEXT NOT NULL,
      FOREIGN KEY(user_id) REFERENCES user(id)
)

W momencie wykonania:

INSERT INTO user_comment(note) VALUES('notatki');

SQLite wstawia mi automagicznie do 'user_id' wartość - w przypadku pustej tabeli wartość 1, w przypadku nie pustej kolejną wartość numeryczną. Chciałbym aby SQLite tego nie robił. ;) Czyli aby powyższe wykonanie polecenia INSERT powodowało zwrócenie błędu zamiast dodania wiersza do tabeli.

0

Z tego co pamiętam to w którymś SQLite był taki "ficzer", że jak dałeś user_id INTEGER PRIMARY KEY NOT NULL, to był automatycznie autoincrement. A jak dałeś user_id INT PRIMARY KEY NOT NULL to już nie :)

2

A nie możesz pola note przenieść do tabeli user?

0
Marcin.Miga napisał(a)

Z tego co pamiętam to w którymś SQLite był taki "ficzer", że jak dałeś user_id INTEGER PRIMARY KEY NOT NULL, to był automatycznie autoincrement. A jak dałeś user_id INT PRIMARY KEY NOT NULL to już nie :)

I dalej ten "ficzer" działa i nawet zastanawiałem się już wcześniej czy go nie zastosować. Jednak tu mam zastrzeżenie czy nie będzie to działało "wolniej" niż gdy zadeklaruję jako 'INTEGER'?

Rev napisał(a)

A nie możesz pola note przenieść do tabeli user?

Raczej nie, ponieważ z tego co słyszałem może to zaważyć na wydajności przy wyszukiwaniu w tabeli "user", jeśli wartości 'note' będą zawierać długie poematy. ;)

1

Raczej nie, ponieważ z tego co słyszałem może to zaważyć na wydajności przy wyszukiwaniu w tabeli "user", jeśli wartości 'note' będą zawierać długie poematy. ;)

A wtedy wymyślili indeksy.

0
Rev napisał(a)

Raczej nie, ponieważ z tego co słyszałem może to zaważyć na wydajności przy wyszukiwaniu w tabeli "user", jeśli wartości 'note' będą zawierać długie poematy. ;)

A wtedy wymyślili indeksy.

Zapomniałem napisać, że w przyszłości do tabeli "user_comment" planuję dodać minimum atrybut typu BLOB, do umieszczania zdjęć.

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