Разумеется, такое возможно. Это называется "составной ключ", обычно речь идет о составном первичном ключе.
Составной первичный ключ создается вместе с таблицей так:
create table TheTable (
a, b, c,
CONSTRAINT PRIMARY KEY (a, b)
)
Дополнительный ключ, он же ограничение уникальности, задается так:
create table TheTable (
a, b, c,
CONSTRAINT UNIQUE (a, b)
)
Разница между первичным ключом и дополнительным ключом - в том, что первичный ключ может быть только один и не может содержать необязательные атрибуты (указанные в нем атрибуты автоматически получают модификатор NOT NULL).
Также ограничение уникальности можно наложить при помощи уникального индекса:
CREATE UNIQUE INDEX IX_TheTable ON TheTable (a, b)
Разница между уникальным индексом и дополнительным ключом - в семантике. Ограничение уникальности - это часть модели данных, уникальный же индекс - это способ оптимизации поиска в БД. Но реально во всех известным мне реализациях они, как правило, взаимозаменяемы.
Еще одна возможность индекса, которой нет у ограничений - частичные индексы:
CREATE UNIQUE INDEX IX_TheTable ON TheTable (a, b) WHERE c <> 4
Теперь если атрибут c равен 4, то значения пары атрибутов (a, b) могут повторяться. Не знаю, правда, зачем такое может потребоваться...
PS отвечал я, в основном, про SQLite - но и для других СУБД многое из этого ответа применимо, поскольку "вырастает" из теории реляционных баз данных и из стандарта языка SQL.