Intereting Posts
Что эквивалентно «select max (column) from table» в pytables oracle: имя динамического столбца хранимую процедуру, чтобы найти значение в 2 столбцах из 3 Что делает Include () в LINQ? Как продолжить цикл while после исключения в SQL Условно суммировать одну и ту же колонку несколько раз в одном выражении select? Столбец, неоднозначно определенный в подзапросе с использованием робусов Эффективный PostgreSQL-запрос на метку времени с использованием индекса или растрового сканирования индекса? Поиск записи – в базе данных (без указания имени столбца / имени таблицы) Получайте количество будних дней (по воскресеньям, понедельникам, вторникам) между двумя датами SQL MySQL рассчитывает N последовательных дней в обычных таблицах формы Обеспечение ограничений между таблицами Загруженные файлы Docx становятся поврежденными Преобразование числа во времени Удалить из двух таблиц с круговыми внешними ключами

уникальные значения в столбце, но только уникальные для каждого связанного внешнего ключа

Я прошу прощения за запутанный титул, но я действительно не уверен, как описать эту проблему в одном предложении.

У меня есть база данных SQLite для обобщенного соревнования по опрокидыванию. Для тех, кто не знаком с этой концепцией, люди «подскажут», которые, по их мнению, победят в каждом матче каждого раунда спортивного соревнования, а побеждает человек с самыми правильными советами в конце соревнований (выигрыш может быть деньгами, гордостью , и т.д). Он очень популярен в Австралии с AFL.

Основная структура заключается в том, что пользователи регистрируются как владелец, и затем могут создавать столько конкурсов, сколько захотят, и каждый конкурс связан с ними с помощью внешнего ключа. Это важная часть схемы базы данных:

create table owner ( owner_id INTEGER NOT NULL, owner_name VARCHAR NOT NULL, owner_nick VARCHAR UNIQUE NOT NULL, owner_email VARCHAR NOT NULL, owner_password VARCHAR NOT NULL, CONSTRAINT owner_pk PRIMARY KEY (owner_id) ); create table comp ( comp_id INTEGER NOT NULL, comp_owner_id INTEGER NOT NULL, comp_name VARCHAR UNIQUE NOT NULL, CONSTRAINT comp_pk PRIMARY KEY (comp_id), CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE ); 

Суть проблемы заключается в следующем: я хочу применить уникальное ограничение для поля comp_name таблицы comp (как показано выше), потому что у одного владельца не должно быть двух или более соревнований с тем же именем. Тем не менее, вполне возможно, что два разных владельца захотят двух разных соревнований с таким же названием (например, два офиса, которые проводят соревнования по опросу в одной и той же спортивной лиге). Можно ли обеспечить выполнение этого с помощью SQL, или мне нужно выполнить принудительное выполнение вручную в другом месте?

Несколько примечаний:

  • Я использую SQLite 3.6.20, который имеет надлежащее принуждение внешнего ключа
  • База данных никогда не будет использоваться в приложении уровня производства. Это частный проект.
  • База данных используется в веб-приложении PHP.
  • Если этого не может быть достигнуто с помощью SQLite, можно ли это сделать с MySQL?

EDIT: Я чувствую, что должен отметить, что я знаю, что SQLite имеет очень ограниченную поддержку таблиц, и удаление базы данных и запуск – это очень важный вариант.

Просто создайте ограничение UNIQUE для этих двух полей, например:

 create table comp ( comp_id INTEGER NOT NULL, comp_owner_id INTEGER NOT NULL, comp_name VARCHAR NOT NULL, CONSTRAINT comp_unq UNIQUE (comp_owner_id, comp_name), CONSTRAINT comp_pk PRIMARY KEY (comp_id), CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE ); 

который должен делать то, что вы хотите.

Вы можете создать сложное ограничение UNIQUE с помощью этого синтаксиса:

 create table comp ( comp_id INTEGER NOT NULL, comp_owner_id INTEGER NOT NULL, comp_name VARCHAR, CONSTRAINT comp_pk PRIMARY KEY (comp_id), CONSTRAINT comp_unique UNIQUE (comp_owner_id, comp_name), CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE ); 

Если ваша проблема связана с добавлением ограничения на уже существующую таблицу, вы можете сделать это с помощью:

  CREATE UNIQUE INDEX comp_unique (comp_owner_id, comp_name) ON comp 

Кроме того, вы можете потерять столбец owner_id и просто использовать owner_name в качестве первичного ключа в таблице владельца. Аналогично, вам может не понадобиться comp_id, так как у вас есть другой ключ кандидата в этой таблице.