Несколько Примари Кеи в SQLite3

Привет я хочу таблицу в SQLite, у которого было бы 2 поля как primary key и кроме того, поле id что был единственным целым числом. Поскольку я искал, это что-то такое, что я схватил:

create table t (id integer, name string, phone string, nick string PRIMARY KEY(name, phone);

До сих пор все добро, но поле id не верьте как целое число autoincrement. Он был бы должен определить это как:

create table t (id integer PRIMARY KEY AUTOINCREMENT, .......)

Но тогда я не могу помещать другие 2 поля как primary key. Из-за поля id в принципе я не буду искать, только он интересует меня, что это было единственное поле. Я протестировал различные изменения и он говорит мне, что таблица t у него есть больше одной primary key.

Спасибо за сотрудничество.

2
задан 20.01.2017, 14:58
1 ответ

Мы исходим из следующих данных:

  • Только может существовать первичный ключ в таблице.
  • PRIMARY KEY AUTOINCREMENT это прозвище ROWID

Первый мешает тому, чтобы ты смог определять твое поле id как автоувеличенный и, позже, используй это как первичный ключ рядом с name и phone, но ты забываешь о том, что ЕДИНСТВЕННЫЙ ИНДЕКС - функционально то же самое, что и ПЕРВИЧНЫЙ КЛЮЧ:

create table t (
  id integer PRIMARY KEY AUTOINCREMENT,
  name string,
  phone string,
  nick string,
  UNIQUE INDEX(id, name, phone)
);

Функционально ты считаешь решенной твою проблему с единственным ключом, но также должен иметь в виду, что sqlite он поддерживает идентификатора реестра автоматического способа, который можешь использовать, чтобы заменять ты id что ссылается посредством полей rowid, oid or _rowid_.

Ты мог бы опускать вышеупомянутое поле заявления и использовать как первичный ключ name и phone:

create table t (
  name string,
  phone string,
  nick string,
  PRIMARY KEY(name, phone)
);

Безусловно rowid он будет единственным и следовательно, функционально, он составил бы часть первичного ключа.

Ты должен вспоминать, которого, в случае когда используешь * в твоих консультациях, ты должен получать ясно это поле используя, например:

SELECT rowid, * FROM t ...
1
ответ дан 03.12.2019, 20:51

Я ты recomendarГ, - чтобы использовать ID как первичный ключ и использовать ее restricciГіn unicidad в имени и telГ©fono:

Видеть https://www.sqlite.org/lang_createtable.html#uniqueconst

create table t (
 id integer PRIMARY KEY AUTOINCREMENT, 
 name string, 
 phone string, 
 nick string );

CREATE UNIQUE INDEX i1 ON t(phone, name);
2
ответ дан 24.11.2019, 13:40