-
Ah entendi o peguinha.
A ideia é que poder fazer futuramente um alter ftable
FOREIGN KEY (perfil)
REFERENCES perfil (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
-
Estranho.
Para mim a questão está errada.
Fiz o teste abaixo da DDL abaixo, e o BD não permite criar uma FK sem refrenciar a coluna.
Abaixo está o código correto:
create table A(
id int PRIMARY KEY
);
create table B(
id int PRIMARY KEY,
id_a int NOT NULL,
CONSTRAINT fk_para_tabela_a FOREIGN KEY (id_a) REFERENCES A(id)
);
Porém, se eu retirar a coluna da tabela referenciada o comando não compila:
create table B(
id int PRIMARY KEY,
id_a int NOT NULL,
CONSTRAINT fk_para_tabela_a FOREIGN KEY (id_a) REFERENCES A
);
-
Pra mim isso ai ta errado. No momento da criação da tabela temos que dizer qual a coluna referenciada.
-
Questão CERTA.
Embora a tabela tenha que ser referencia na definição de uma chave estrangeira, a COLUNA referenciada é opcional segundo o ANSI SQL. Portanto, o item está correto pois não é necessário informar a coluna referenciada.
Vejamos dois exemplos que são equivalentes.
Exemplo 1 (coluna referenciada (no caso coluna ID da tabela CIDADE) foi informada mas é opcional):
CREATE TABLE PESSOA (
Id integer PRIMARY KEY,
Nome text,
Cidade_id integer,
FOREIGN KEY (Cidade_id)
REFERENCES CIDADE(Id) /* coluna referenciada (no caso coluna ID da tabela CIDADE) foi informada mas é opcional */
);
Exemplo 2 (coluna referenciada pode ser omitida):
CREATE TABLE PESSOA (
Id integer PRIMARY KEY,
Nome text,
Cidade_id integer,
FOREIGN KEY (Cidade_id)
REFERENCES CIDADE /* coluna referenciada pode ser omitida */
);
Fonte: Item 11.8 (referential constraint definition) do ANSI SQL-92:
https://www.dropbox.com/s/oi382sokz32wzak/SQLANSI-CONSTRAINT.png?dl=0
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
Embora a questão não diga nada sobre SGBD, é possível testar online o DDL no SQL LITE em http://www.compileonline.com/execute_sql_online.php:
BEGIN TRANSACTION;
CREATE TABLE CIDADE (
Id integer PRIMARY KEY,
Nome text
);
INSERT INTO CIDADE VALUES(1, 'São José do Rio Preto');
INSERT INTO CIDADE VALUES(2, 'Belo Horizonte');
/* Cria a tabela PESSOA que tem uma chave estrangeira para tabela CIDADE */
CREATE TABLE PESSOA (
Id integer PRIMARY KEY,
Nome text,
Cidade_id integer,
FOREIGN KEY (Cidade_id)
REFERENCES CIDADE /* De fato não é necessário informar a coluna referencida (coluna id da tabela CIDADE). Ou seja, não é necessário "REFERENCES CIDADE (id)". "REFERENCES CIDADE" já é suficiente. */
);
/* Cria alguns registros */
INSERT INTO PESSOA VALUES(1, 'Maria', 1);
INSERT INTO PESSOA VALUES(2, 'Jose', 2);
COMMIT;
/* Mostra os registros. */
SELECT * FROM PESSOA;
-
Nesse caso ele considera a coluna (PRIMARY KEY) da tabela referenciada.
-
Bora tentar desvendar essa noi**a:
Uma Chave Estrangeira em uma tabela é um campo que aponta para uma chave primária em outra tabela. Dessa forma é mantida a integridade referencial entre as tabelas relacionadas.
Vamos a um exemplo:
TABELA1 AUTORES
CREATE TABLE tbl_autores (
ID_Autor integer PRIMARY KEY,
Nome text NOT NULL,
Data_Nasc date,
);
TABELA2 LIVRO
CREATE TABLE tbl_livros (
ID_Livro integer PRIMARY KEY,
Nome_Livro text NOT NULL,
Data_Pub date,
ID_Autor integer NOT NULL,
CONSTRAINT fk_ID_Autor FOREIGN KEY (ID_Autor)
REFERENCES tbl_autores(ID_Autor)
);
Neste exemplo, temos duas tabelas relacionadas por uma FK q está definida na parte em negrito(repare q a chave primária está em uma tabela de nome tbl_autores, e uma chave estrangeira de nome fk_ID_Autor foi criada na tabela atual (tbl_livros), usando a coluna de nome ID_Autor).
Agora vem a bomba(a pergunta q não quer calar):
A questão diz o seguinte: "No momento de criação de uma tabela(ou seja, no momento da criacao do SQL acima), para se definir uma chave estrangeira, não é necessário informar a coluna referenciada". Ou seja, de acordo com a questao, o codigo SQL da TABELA2 funcionaria de boas:
CREATE TABLE tbl_livros (
ID_Livro integer PRIMARY KEY,
Nome_Livro text NOT NULL,
Data_Pub date,
ID_Autor integer NOT NULL,
CONSTRAINT fk_ID_Autor FOREIGN KEY
);
Ou seja, a linha em negrito acima está criando uma FK, naõ sendo necessaŕio mais nada além disso, o q, a meu ver, está errado!!!
Não consegui executar o codigo acima em nenhum banco(Mysql, Postgree, Oracle e SQL Server).
Se alguem conseguiu, favor, poste aqui!!!
OBS: e não tem esse negocio de peguinha, não! A questao é bem clara: No momento de criação de uma tabela!!!, Sr Mr Robot!!!
Fonte:
[1] http://www.bosontreinamentos.com.br/postgresql-banco-dados/constraints-no-postgresql-restricoes/
-
Essa banca é uma brincante!
-
Quando vc acha que está aprendendo sobre BANCO DE DADOS vem o Cespe e acaba com suas certezas. kkkkk
Achei que quando criava uma chave estrangeira tinha que fazer referencia da chave primária na tabela.
A chave primária de uma tabela virava chave estrangeria em outra tabela.