#sql #sqlite
Вопрос:
Я хочу иметь возможность найти значение, используя либо network_id, либо имя пользователя. Тем не менее, следующий синтакс выдает ошибку более чем одного первичного ключа (как и ожидалось).
CREATE TABLE Player(
network_id TEXT not null,
username varchar2(50) not null,
value INTEGER,
CONSTRAINT player_pk1 PRIMARY KEY (username),
CONSTRAINT player_pk2 PRIMARY KEY (network_id)
);
Есть ли способ, которым я мог бы сделать это в Sqlite?
Комментарии:
1. таблица может иметь только один первичный ключ
2. @Сергей, я в курсе, мне просто интересно, как я мог бы сделать что-то подобное в рамках Sql
3. извините, но «найти значение с помощью network_id или имени пользователя» не имеет отношения к первичному ключу.
4. Вам вообще не нужен ключ. С
select * from player where network_id = 123
вами находите строки по сетевому идентификатору, а сselect * from player where username = 'Mr. X'
вами находите строки по имени пользователя. Вы можете предоставить индексы, которые ускоряют такие запросы. SQLite автоматически предоставляет такие индексы для первичных ключей и столбцов с уникальным ограничением, но вы также можете создать их самостоятельно.5. Должен ли идентификатор network_id быть уникальным в вашей таблице (т. Е. Это на самом деле идентификатор игрока) или у нескольких игроков может быть один и тот же сетевой идентификатор?
Ответ №1:
Первичный ключ имеет три компонента для своего определения:
NOT NULL
UNIQUE
- Только по одному на стол
Вот почему у вас не может быть больше одного. Но у вас может быть любое количество NOT NULL
UNIQUE
столбцов:
CREATE TABLE Player(
network_id TEXT not null,
username varchar2(50) not null,
value INTEGER,
CONSTRAINT player_pk1 PRIMARY KEY (username),
CONSTRAINT unq_player_network_id UNIQUE (network_id)
);