SóProvas


ID
1215130
Banca
CESPE / CEBRASPE
Órgão
TJ-SE
Ano
2014
Provas
Disciplina
Banco de Dados
Assuntos

Julgue os itens que se seguem, acerca das linguagens de definição, manipulação, controle e transação de dados em sistemas gerenciadores de banco de dados relacionais.

No momento de criação de uma tabela, para se definir uma chave estrangeira, não é necessário informar a coluna referenciada.

Alternativas
Comentários
  • 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.