SQL Server 2008: столбцы в таблице не соответствуют существующему первичному ключу или уникальному ограничению
Мне нужно внести некоторые изменения в базу данных SQL Server 2008.
Для этого требуется создание новой таблицы и вставка внешнего ключа в новую таблицу, которая ссылается на основной ключ уже существующей таблицы. Поэтому я хочу установить связь между моим новым tblTwo, который ссылается на первичный ключ tblOne.
Однако, когда я пытался это сделать (через SQL Server Management Studio), я получил следующую ошибку:
Столбцы в таблице "tblOne" не сопоставить существующий первичный ключ или УНИКАЛЬНОЕ ограничение
Я не совсем уверен, что это значит, и мне было интересно, есть ли что-то в этом роде?
Ответы
Ответ 1
Это означает, что первичный ключ в tblOne не был объявлен должным образом - вам нужно перейти в tblOne и добавить на него ограничение PRIMARY KEY.
Если вы уверены, что у tblOne есть ограничение PRIMARY KEY, то, возможно, в вашей БД есть несколько таблиц tblOne, принадлежащих разным схемам, а ваше предложение ссылок в вашем ограничении FK выбирает неправильный.
Если есть составной ключ (который будет указывать ваш комментарий), тогда вы должны включить оба столбца в свою ссылку на внешний ключ. Обратите внимание, что таблица не может иметь несколько первичных ключей, но если у нее есть составной ключ, вы увидите символ ключа рядом с каждым столбцом, который является частью первичного ключа.
Ответ 2
Если у вас есть составной ключ, порядок важен при создании FK, а иногда порядок не отображается.
Что я делаю, перейдите в раздел "Ключи" таблицы1 и выберите первичный ключ script как создайте в буфер обмена, а затем создайте FK, используя порядок, как показано в script
Ответ 3
У меня была такая ситуация, которая привела меня к этой теме. Такая же ошибка, но другая причина. Может быть, это поможет кому-то.
Table1
ColA (PK)
ColB (PK)
ColC
Table2
ID (PK)
ColA
COLB
При попытке создать внешний ключ в таблице 2 я выбираю значения из поля со списком в обратном порядке
Table1.ColB = Table2.ColB
Table1.ColA = Table2.ColA
Это вызвало ошибку, как в названии темы. Создание порядка хранения столбцов в таблице первичных ключей, как они есть, исчезла ошибка.
Глупо, но..:)
Ответ 4
Если вы по-прежнему получаете эту ошибку после того, как последовали все советы из приведенных выше ответов, все выглядит правильно.
Один из способов исправить это, удалив основные ключи для обеих таблиц, сохраните, обновите и добавьте их снова.
Затем попробуйте добавить свои отношения снова.
Ответ 5
Эта проблема меня поймала, я добавлял отношения в неправильную таблицу. Поэтому, если вы пытаетесь добавить отношения в таблицу A в таблицу B, попробуйте добавить отношение в таблицу B к таблице A.
Ответ 6
Эта ошибка произошла со мной When
Я попытался ограничить add foreign key
, начиная с PrimaryKey Table
Simpy перейдите в другую таблицу и create this foreign key
ограничение from
там (foreign key Table)
Ответ 7
Похоже, вы пытаетесь создать внешний ключ в tblTwo, который не соответствует (или участвует) с любым первичным ключом или уникальным индексом в tblOne.
Отметьте эту ссылку на MSDN. Здесь у вас есть другая ссылка с практическим случаем .
EDIT:
Отвечая на ваш комментарий, я понимаю, вы имеете в виду, что в первичном ключе есть 2 поля (что делает его составным). В SQL невозможно иметь 2 первичных ключа в одной таблице.
IMHO, поле внешнего ключа должно всегда ссылаться на один регистр в ссылочной таблице (т.е. весь первичный ключ в вашем случае). Это означает, что перед созданием внешнего ключа необходимо поместить оба поля первичного ключа tblOne в tblTwo.
В любом случае, я немного поработал над Интернетом, и кажется, что SQL Server 2008 (как некоторые предыдущие версии и другие РСУБД) дает вам возможность ссылаться только на часть первичного ключа, пока эта часть является ключом кандидата ( Not Null и Unique), и вы создаете для него уникальное ограничение.
Я не уверен, что вы можете использовать это в своем случае, но посмотрите эту ссылку для получения дополнительной информации об этом.
Ответ 8
Я обнаружил, что имена столбцов должны совпадать.
Пример:
Так что если tblOne имеет id, называемый categoryId, ссылку в tblTwo также следует называть categoryId.
_tblname, primary key name, foreign key_
tblOne, "categoryId", none
tblTwo, "exampleId", "categoryId"
Я заметил это при попытке создать внешний ключ между двумя таблицами, которые оба имели имя столбца "id" в качестве первичного ключа.
Ответ 9
Если ничего не помогает, то это может быть причиной:
Учитывая этот случай:
Таблица A:
Столбец 1 (первичный ключ)
Столбец 2 (первичный ключ)
Столбец 3
Столбец 4
Таблица B:
Столбец a (первичный ключ)
Столбец b
Столбец c
когда вы определяете зависимость B от A, вы вынуждены соблюдать порядок, в котором определены первичные значения.
Это означает, что ваша зависимость должна выглядеть так:
Таблица A Таблица B
Столбец 1 Столбец b
Столбец 2 Столбец c
И НЕ:
Таблица A Таблица B
Столбец 2 Столбец c
Столбец 1 Столбец b
то это приведет к ошибке, с которой вы сталкиваетесь.
Ответ 10
Я нашел другой способ получить эту ошибку. Это также может произойти, если вы пытаетесь сделать рекурсивный внешний ключ (внешний ключ для первичного ключа в той же таблице) в представлении дизайна в SQL Management Studio. Если вы еще не сохранили таблицу с помощью первичного ключа, она вернет это сообщение. Просто сохраните таблицу, тогда она позволит вам создать внешний ключ.