0

Я разрабатываю данные (-s) для хранения списка акционеров. В случае если акционер является кандидатом, он раскрывает список владельцев акций. Все они должны иметь кучу подобных ссылок. Таким образом, я хотел бы сохранить все в одной таблице. Номинанты являются зарегистрированными акционерами и, следовательно, у них есть номер счета в системе, из которого я получаю данные. Против этого, владельцы акций, которые поступают из номинального раскрытия информации, не имеют собственного номера счета и имеют номер счета участника.Саморегуляция частичного ключа таблицы

Я добавляю в таблицу уникальный идентификатор. Я хотел бы предположить, что все зарегистрированные акционеры и номинанты имеют 0 в этой области. Список раскрытия (незарегистрированные владельцы акций, работающие через номинального держателя) имеют значение выше нуля в этом уникальном идентификаторе. В основном, нумерованный список.

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

Чтобы лучше объяснить, вот выдержка:

Create Table Account (
    AccountId Int, 
    Uniquifier Int, 

    NomineeId Int, 

    Constraint PK$Account Primary Key (AccountId, Uniquifier)  
) 

То, что я пытаюсь сделать что-то вроде:

Alter Table Account 
    Add Constraint FK$SelfReference Foreign Key (NomineeId) References Account (AccountId) 

, который является незаконным, так как

There are no primary or candidate keys in the referenced table 'Account' that match the referencing column list in the foreign key 'FK$SelfReference'. 

Любая помощь приветствуется.

+0

Ну, что я могу сделать ' Alter Table Account Добавить AlwaysZero Int Null; Alter Table Account Добавить Constraint FK $ SelfReferenceWierd External Key (NomineeId, AlwaysZero) Ссылки Учетная запись (AccountId, Uniquifier) ​​ 'и добавьте искусственное поле, которое всегда будет содержать 0, ссылаясь на строку, которая в предположении всегда будет иметь 0 в столбце Uniquifier. Конечно, я могу даже добавить некоторые ограничения проверки для этого, но это выглядит странно для меня, и должны быть лучшие способы. –

ответ

2

Вы можете добавить computed column, который будет 0, когда FK должен быть применен и NULL в противном случае. Это может быть использован в ссылке внешнего ключа:

Create Table Account (
    AccountId Int, 
    Uniquifier Int, 

    NomineeId Int, 
    NomineeXRef as CASE WHEN Uniqueifier > 0 THEN 0 END persisted 

    Constraint PK$Account Primary Key (AccountId, Uniquifier), 
    Constraint FK$SelfReference Foreign Key (NomineeId,NomineeXRef) References Account (AccountId, Uniquifier)  
) 
+0

Выглядит элегантно. Я удалил NomineeId и использовал AccountId вместо FK. Плюс контрольное ограничение для NomineeXRef, которое должно быть либо 0, либо NULL, должно обрабатывать задачу. –

+0

Извините, проверка не нужна, поскольку вычисляемый столбец не может вернуть ничего, кроме 0 или Null. Спасибо! –