У меня никогда не было «кодированного» вручную кода создания объекта для SQL Server, и расшифровка внешнего ключа, по-видимому, различна для SQL Server и Postgres. Вот мой sql пока:
drop table exams;
drop table question_bank;
drop table anwser_bank;
create table exams
(
exam_id uniqueidentifier primary key,
exam_name varchar(50),
);
create table question_bank
(
question_id uniqueidentifier primary key,
question_exam_id uniqueidentifier not null,
question_text varchar(1024) not null,
question_point_value decimal,
constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
anwser_id uniqueidentifier primary key,
anwser_question_id uniqueidentifier,
anwser_text varchar(1024),
anwser_is_correct bit
);
Когда я запускаю запрос, я получаю эту ошибку:
Сообщение 8139, Уровень 16, Состояние 0, Строка 9 Количество ссылочных столбцов во внешнем ключе отличается от количества ссылочных столбцов, таблица 'question_bank'.
Можете ли вы определить ошибку?
sql
sql-server
tsql
mmattax
источник
источник
Ответы:
источник
И если вы просто хотите создать ограничение самостоятельно, вы можете использовать ALTER TABLE
Я бы не рекомендовал синтаксис, упомянутый Сарой Чиппс, для создания inline, просто потому, что я бы скорее назвал свои собственные ограничения.
источник
Вы также можете назвать ограничение внешнего ключа, используя:
источник
Мне нравится ответ AlexCuse, но при добавлении ограничения внешнего ключа следует обращать внимание на то, как нужно обрабатывать обновления столбца, на который есть ссылка, в строке таблицы, на которую есть ссылка, и особенно на то, как вы хотите удалять строки в ссылочном столбце. стол для лечения.
Если ограничение создано следующим образом:
.. затем обновления или удаления в ссылочной таблице будут взорваны с ошибкой, если в ссылочной таблице есть соответствующая строка.
Это может быть поведение, которое вы хотите, но по моему опыту, гораздо чаще это не так.
Если вы вместо этого создадите это так:
..то обновления и удаления в родительской таблице приведут к обновлениям и удалению соответствующих строк в ссылочной таблице.
(Я не предполагаю, что значение по умолчанию должно быть изменено, ошибка по умолчанию на стороне предостережения, и это хорошо. Я просто говорю, что человек, создающий константы, должен всегда обращать на это внимание .)
Это может быть сделано, кстати, при создании таблицы, например:
источник
- Это тоже сработает. Может быть, немного более интуитивно понятная конструкция?
источник
Создать внешний ключ на любой таблице
источник
Если вы хотите создать два столбца таблицы во взаимосвязи с помощью запроса, попробуйте следующее:
источник
Как и вы, я обычно не создаю внешние ключи вручную, но если по какой-то причине мне нужен сценарий, я обычно создаю его с помощью MS SQL Server Studio Management Studio и перед сохранением изменений я выбираю Table Designer | Создать скрипт изменения
источник
Этот скрипт предназначен для создания таблиц с внешним ключом, и я добавил ограничение ссылочной целостности sql-server .
источник
Necromancing.
На самом деле, сделать это правильно немного сложнее.
Сначала вам нужно проверить, существует ли первичный ключ для столбца, на который вы хотите установить свой внешний ключ.
В этом примере создается внешний ключ для таблицы T_ZO_SYS_Language_Forms со ссылкой на dbo.T_SYS_Language_Forms.LANG_UID
источник
Я всегда использую этот синтаксис для создания ограничения внешнего ключа между двумя таблицами
т.е.
источник