Автогенерация составного ключа в SQLite - PullRequest
2 голосов
/ 25 марта 2019

У меня есть составной первичный ключ {shop_id, product_id} для SQLite Теперь мне нужно значение автоинкремента для product_id, которое сбрасывается в 1 при изменении идентификатора магазина. В основном, я хочу автоматически сгенерированный составной ключ например,

Идентификатор магазина Идентификатор продукта

1 1

1 2

1 3

2 1

2 2

3 1

Можно ли этого добиться с помощью автоинкремента? Как?

1 Ответ

3 голосов
/ 25 марта 2019

Обычные таблицы 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;
...