У меня есть десять или более (я не знаю) таблиц с столбцом с именем foo с одинаковым типом данных.
Как я могу сказать sql, что значения во всех таблицах должны быть уникальными.
Я имею в виду If (у меня есть значение «1» в таблице 1). Я не должен иметь значение «1» в таблице2.Как я могу иметь уникальный столбец во многих таблицах
ответ
У вас есть общая идентификационная таблица, на которую ссылаются эти десять таблиц. Это будет хорошо работать, поскольку оно будет обеспечивать уникальные идентификаторы, но не означает, что вы не могли бы дублировать идентификаторы в таблице, если кто-то действительно этого хочет.
То, что я имею в виду, является общей таблицей идентификаторов, гарантирует, что у вас нет дубликатов для вставки (путем вставки идентификатора в эту общую таблицу), но дело в том, чтобы гарантировать, что это никогда не произойдет, путем создания бизнес-правил в систему или размещения контрольных ограничений для перекрестных ссылок на другие таблицы (что обеспечило бы уникальность, но ухудшало бы производительность).
Вы можете определить поле как GUID (или UNIQUEIDENTIFIER на SQL-сервере). Тогда он всегда будет уникальным, несмотря ни на что.
Вопрос сформулирован смутно; если вам нужно создать столбец, который является уникальным среди нескольких таблиц, используйте идентификаторы строк GUID или общую таблицу генератора идентификаторов; если вам нужно обеспечить уникальность (и значения полей уже есть), используйте триггеры.
Как правило, если вы генерируете значения, вам не нужно ничего принуждать. Логика генерации, если это будет сделано правильно, позаботится об этом. Если вы вставляете, скажем, пользовательский ввод, то вы можете и должны применять уникальность при вставке. Как правило проверки или что-то в этом роде.
Я хочу иметь некоторые ошибки, если значение, которое я пытаюсь вставить, не является уникальным (я хочу сказать, есть ли проблема с параллелизмом в моей программе). Но мне не нравятся триггеры (потому что они кажутся медленными для моей работы (+10 таблиц)) – Behrooz
Любое решение будет медленным, потому что ваш дизайн плох. – HLGEM
@HLGEM: Я сделал это, чтобы иметь самую быструю скорость для запросов. Но я думаю, что вы правы. (Любое решение будет медленным.) – Behrooz
Как установить ограничение проверки для каждой таблицы, так что ID% 10 = N (где N - номер таблицы, от 0 до 9). И используйте IDENTITY (N, 10) каждый раз.
Вопрос: и что произойдет, если в таблице 1 указано 1000 строк. И вставьте 1 строку в таблицу 2. A: Я потерял порядок строк. – Behrooz
Достаточно честный. Я не выбрал это как требование. Если вы сходите по маршруту таблицы идентификаторов, используйте предложение OUTPUT, чтобы убедиться, что у вас нет проблем с параллелизмом. –
Я бы предположил, что, возможно, ваш дизайн испорчен. Почему эти отдельные таблицы? Лучше поместить их в одну таблицу с одним полем идентификатора, а другое - для определения того, что делает эти таблицы spearate (например, id cusotmer). Затем вы можете прочитать о таблицах partioning, если вы хотите, чтобы они были разделены клиентом по соображениям производительности.
Порядок ценностей важен. – Behrooz