Eu nunca codifiquei manualmente o código de criação de objeto para o SQL Server e a decodificação de chave estrangeira é aparentemente diferente entre o SQL Server e o Postgres. Aqui está o meu sql até agora:
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
);
Quando executo a consulta, recebo este erro:
Msg 8139, Nível 16, Estado 0, Linha 9 O número de colunas de referência na chave estrangeira difere do número de colunas referenciadas, tabela 'question_bank'.
Você consegue identificar o erro?
sql
sql-server
tsql
mmattax
fonte
fonte
Respostas:
fonte
E se você quiser criar a restrição por conta própria, poderá usar ALTER TABLE
Eu não recomendaria a sintaxe mencionada por Sara Chipps para criação em linha, apenas porque prefiro nomear minhas próprias restrições.
fonte
Você também pode nomear sua restrição de chave estrangeira usando:
fonte
Eu gosto da resposta de AlexCuse, mas algo que você deve prestar atenção sempre que adicionar uma restrição de chave estrangeira é como deseja que as atualizações da coluna referenciada em uma linha da tabela referenciada sejam tratadas e, principalmente, como deseja excluir exclusões de linhas na referenciada tabela a ser tratada.
Se uma restrição for criada assim:
.. as atualizações ou exclusões na tabela referenciada explodem com um erro se houver uma linha correspondente na tabela de referência.
Esse pode ser o comportamento que você deseja, mas, na minha experiência, é muito mais comum.
Se você o criar assim:
..as atualizações e exclusões na tabela pai resultarão em atualizações e exclusões das linhas correspondentes na tabela de referência.
(Eu não estou sugerindo que o padrão deva ser alterado, o padrão erra por precaução, o que é bom. Só estou dizendo que é algo que uma pessoa que está criando constaints deve sempre prestar atenção .)
Isso pode ser feito, a propósito, ao criar uma tabela, assim:
fonte
- Isso também funcionará. Talvez uma construção um pouco mais intuitiva?
fonte
Para criar uma chave estrangeira em qualquer tabela
fonte
Se você deseja criar duas colunas da tabela em um relacionamento usando uma consulta, tente o seguinte:
fonte
Como você, normalmente não crio chaves estrangeiras manualmente, mas se por algum motivo eu precisar do script, normalmente o crio usando o ms sql server management studio e antes de salvar e depois as alterações, seleciono Table Designer | Gerar script de alteração
fonte
Este script é sobre a criação de tabelas com chave estrangeira e eu adicionei restrição de integridade referencial sql-server .
fonte
Necromante.
Na verdade, fazer isso corretamente é um pouco mais complicado.
Você primeiro precisa verificar se a chave primária existe para a coluna à qual você deseja definir sua chave estrangeira.
Neste exemplo, uma chave estrangeira na tabela T_ZO_SYS_Language_Forms é criada, referenciando dbo.T_SYS_Language_Forms.LANG_UID
fonte
Eu sempre uso essa sintaxe para criar a restrição de chave estrangeira entre 2 tabelas
ie
fonte