Обычные таблицы Sqlite - это B * -деревья, которые используют 64-битное целое число в качестве ключа.Это называется rowid .При вставке строки, если значение не указано явно для этого, генерируется одно.Столбец INTEGER PRIMARY KEY
действует как псевдоним для этого rowid.Ключевое слово AUTOINCREMENT
, которое может использоваться только в указанном столбце INTEGER PRIMARY KEY
, в отличие от имени, просто изменяет способ вычисления указанного rowid - если вы пропустите значение, оно будет создано независимо от того, присутствует это ключевое слово или нет,потому что это действительно rowid и должен иметь номер.Подробности здесь .(Значения rowid обычно генерируются в возрастающем, но не обязательно последовательном порядке, и их не следует рассматривать как номер строки или что-то в этом роде, кстати).
Любой первичный ключ, кроме одного INTEGER
Столбец обрабатывается как уникальный индекс, в то время как идентификатор строки остается истинным первичным ключом (если только это не таблица БЕЗ ROWID ) и не генерируется автоматически.Итак, нет, вы не можете (легко) делать то, что хотите.
Я бы, вероятно, разработал дизайн базы данных, в котором у вас есть таблица магазинов, таблица продуктов, каждый со своими идентификаторами, итаблица соединений, которая устанавливает отношение «многие ко многим» между ними.Это позволяет сохранять одинаковые идентификаторы товаров в разных магазинах, что, вероятно, будет менее запутанным для людей - я бы не ожидал, что один и тот же товар будет иметь разные SKU в двух разных магазинах одной и той же сети, например.
Что-то вроде:
CREATE TABLE stores(store_id INTEGER PRIMARY KEY
, address TEXT
-- etc
);
CREATE TABLE product(prod_id INTEGER PRIMARY KEY
, name TEXT
-- etc
);
CREATE TABLE inventory(store_id INTEGER REFERENCES stores(store_id)
, prod_id INTEGER REFERENCES product(prod_id)
, PRIMARY KEY(store_id, prod_id)) WITHOUT ROWID;