2013-02-15 4 views
1

Say У меня есть 3 таблицы, как в следующем:Как реализовать «мастер» значение Id в столбце таблицы базы данных

Person
PersonId INT [PK, уникальный Clust IDX, идентичности да]
PersonName VARCHAR (50) [ненулевой]
ContactId INT [уникальный, не Clust IDX, ненулевая, FK связаться таблицы ContactId колонка]

Компания
CompanyID INT [PK, уникальный Clust IDX, идентичность да]
НазваниеКомпания VARCHAR (100) [ненулевая]
ContactId INT [уникальный, не Clust IDX, ненулевой, FK связаться столбец ContactId таблицы]

Контакт
ContactId INT [PK, уникальный Clust IDX, идентичность да]
CreatedDate DATETIME [ненулевой, значение по умолчанию GETDATE()]

Я покажу желаемые конечные результаты в течение следующих 3-х операций вставки (начиная со всеми пустыми таблицами) ...

я вставить строку в Person, и хотите, чтобы в конечном итоге с:

Person стол -
PersonId 1
PERSONNAME 'первого лица'
ContactId 1

Контактная таблица -
Контактное лицо 1
CreatedDate getdate() value

Затем я вставить строку в компании, и хотите, чтобы в конечном итоге с:

таблице компании - CompanyID 1
COMPANYNAME 'Первая компания'
ContactId 2

Контакт таблицы - ContactId 2
CreatedDate getdate() value

Я вставляю второй ряд в Person и wan т в конечном итоге с:

Person стол - PersonId 2
PERSONNAME 'Второе Лицо'
ContactId 3

Контактная таблица - 3 значение ContactId
CreatedDate GETDATE()

Надеюсь, что вышеизложенное дает понять, что я пытаюсь выполнить, т.е., Я хочу использовать таблицу контактов как своего рода механизм типа «уникальный генератор значений», так сказать, чтобы каждый раз, когда я вставлял строку в Person или Company (или любые дополнительные таблицы, которые я хотел бы поместить аналогичный столбец ContactId в), каждое значение ContactId в любой/всех этих таблицах будет уникальным.

Что было бы самым эффективным способом для этого? Можно ли это сделать с помощью триггеров в таблицах Person и Company, чтобы я мог выполнять только одну операцию вставки из моего кода приложения (и если да, то каким будет выглядеть код запуска)? Или мне всегда придется выполнять несколько операций ввода-вывода из кода приложения, в котором я сначала вставляю строку в таблицу контактов, возвращаю значение scope_identity() обратно, а затем использую это значение для значения ContactId для вставки в Person или компании? Или какая-то другая методология, которая лучше, чем любая из этих?

Любые идеи очень ценятся!

+0

Кроме того, я извиняюсь для форматирования моего поста - я попытался использовать возврат каретки, но они не кажутся «принять» ... – user2075599

+0

um ... один второстепенный вопрос, как точно убедиться, что возврат каретки «работает» в сообщениях? Я искал FAQ и ничего не видел об этом ... – user2075599

ответ

0

вам нужно иметь sequence для ваших ContactId и вставки значений из последовательности для ContactId на основе триггеров

+0

Святая корова! Я занимаюсь SQL Server в течение 15 лет, и я никогда не видел материал CREATE SEQUENCE, поэтому спасибо за этот отзыв (может быть полезно для некоторых других вещей). Однако я не уверен, что это помогает в моей конкретной ситуации. Если я правильно понимаю CREATE SEQUENCE (после проверки вашей отличной ссылки) ... – user2075599

+0

... если в моем случае таблица контактов вообще не существовала, и все, что мне нужно было сделать, это иметь уникальный набор значений в конкретный столбец в двух или более таблицах, CREATE SEQUENCE будет работать. Но мне нужно, чтобы значение ContactId в таблице Contact было «ведущим» значением, так сказать, (оно будет фактически использоваться как цель FK из некоторых других таблиц). Поэтому в этом случае не похоже, что CREATE SEQUENCE будет достаточно (и мне все же, вероятно, потребуется сделать что-то вроде метода с двумя вставками из моего приложения). Или я чего-то не хватает? – user2075599

+0

вам нужно убедиться, что перед вставкой в ​​таблицу лиц или компаний триггер вставляет следующее значение последовательности в таблицу контактов, а затем вы вставляете текущее значение последовательности в фактическую таблицу – sasikt

Смежные вопросы