Error in primary and secondary keys

0

Well, I tried to normalize the maximum of this table of data, however I got a failure to get the code, where I am not identifying the error in the user:

Table:

Error:

Error 2:

 -- Geração de Modelo físico
-- Sql ANSI 2003 - brModelo.



CREATE TABLE Data_Evento (
id_data_evento INTEGER PRIMARY KEY,
data_inicio DATE,
data_fim DATE
);

CREATE TABLE Hora_Evento (
id_hora INTEGER PRIMARY KEY,
id_evento INTEGER,
hora_inicio TIME,
hora_fim TIME
);

CREATE TABLE Usuario (
id_usuario INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(),
RG VARCHAR(),
usuario VARCHAR(255),
senha VARCHAR(255),
imagem LONGTEXT
);

CREATE TABLE Controle (
id_controle INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(),
RG VARCHAR(),
data_cadastro DATETIME,
data_entrada DATETIME,
data_saida DATETIME
);

CREATE TABLE aluno_curso (
id_aluno_curso INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(),
RG VARCHAR(),
id_curso INTEGER
);

CREATE TABLE Noticia (
id_noticia INTEGER PRIMARY KEY,
titulo VARCHAR(255),
autor VARCHAR(255),
descricao LONGTEXT,
data DATE,
fonte LONGTEXT,
imagem LONGTEXT,
imagem_2 LONGTEXT,
imagem_3 LONGTEXT
);

CREATE TABLE Telefone_Professor (
id_telefone_professor INTEGER PRIMARY KEY,
id_professor INTEGER,
telefone VARCHAR(9),
celular VARCHAR(10)
);

CREATE TABLE Evento (
id_evento INTEGER PRIMARY KEY,
id_data_evento INTEGER,
id_hora INTEGER,
titulo VARCHAR(255),
descricao LONGTEXT,
preco VARCHAR(10),
imagem LONGTEXT,
FOREIGN KEY(id_data_evento) REFERENCES Data_Evento (id_data_evento),
FOREIGN KEY(id_hora) REFERENCES Hora_Evento (id_hora)
);

CREATE TABLE Professor (
id_professor INTEGER PRIMARY KEY,
id_especialidade INTEGER,
id_telefone_professor INTEGER,
id_aula INTEGER,
nome VARCHAR(255),
sobrenome VARCHAR(255),
email VARCHAR(255),
Imagem LONGTEXT,
descricao LONGTEXT,
FOREIGN KEY(id_telefone_professor) REFERENCES Telefone_Professor (id_telefone_professor)
);

CREATE TABLE Aula (
id_aula INTEGER PRIMARY KEY,
tipo VARCHAR(255),
data DATE,
duracao TIME
);

CREATE TABLE Promocao (
id_promocao INTEGER PRIMARY KEY,
id_curso INTEGER,
titulo VARCHAR(255),
promocao VARCHAR(255),
validade DATE,
descricao LONGTEXT,
imagem LONGTEXT
);

CREATE TABLE Curso (
id_curso INTEGER PRIMARY KEY,
titulo VARCHAR(255),
descricao LONGTEXT,
carga VARCHAR(255),
imagem LONGTEXT
);

CREATE TABLE Aluno_Evento (
id_aluno_evento INTEGER PRIMARY KEY,
id_aluno INTEGER,
id_evento INTEGER,
CPF VARCHAR(),
RG VARCHAR(),
FOREIGN KEY(id_evento) REFERENCES Evento (id_evento)
);

CREATE TABLE Endereco (
id_endereco INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(),
RG VARCHAR(),
rua LONGTEXT,
numero VARCHAR(10),
cep VARCHAR(14),
pais VARCHAR(255),
estado VARCHAR(2),
cidade VARCHAR(255)
);

CREATE TABLE Aluno (
id_aluno INTEGER,
CPF VARCHAR(14),
RG VARCHAR(12),
id_usuario INTEGER,
id_controle INTEGER,
id_aluno_promocao INTEGER,
nome VARCHAR(255),
sobrenome VARCHAR(255),
email VARCHAR(255),
nacionalidade VARCHAR(255),
PRIMARY KEY(id_aluno,CPF,RG),
FOREIGN KEY(id_usuario) REFERENCES Usuario (id_usuario),
FOREIGN KEY(id_controle) REFERENCES Controle (id_controle)
);

CREATE TABLE Telefone (
id_telefone INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(),
RG VARCHAR(),
telefone VARCHAR(9),
celular VARCHAR(10),
FOREIGN KEY(RG,,,) REFERENCES Aluno (id_aluno,CPF,RG)
);

CREATE TABLE Modulo (
id_modulo INTEGER PRIMARY KEY,
id_curso INTEGER,
id_professor INTEGER,
titulo VARCHAR(255),
descricao LONGTEXT,
conteudo LONGTEXT,
imagem LONGTEXT,
imagem_2 LONGTEXT,
preco VARCHAR(100),
FOREIGN KEY(id_curso) REFERENCES Curso (id_curso),
FOREIGN KEY(id_professor) REFERENCES Professor (id_professor)
);

CREATE TABLE Especialidade (
id_especialidade INTEGER PRIMARY KEY,
especialidade LONGTEXT,
formacao LONGTEXT
);

CREATE TABLE Aluno_Promocao (
id_aluno_promocao INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(),
RG VARCHAR(),
id_promocao INTEGER,
FOREIGN KEY(RG,,,) REFERENCES Aluno (id_aluno,CPF,RG),
FOREIGN KEY(id_promocao) REFERENCES Promocao (id_promocao)
);

ALTER TABLE Hora_Evento ADD FOREIGN KEY(id_evento) REFERENCES Evento (id_evento)
ALTER TABLE Usuario ADD FOREIGN KEY(/*erro: ??*/) REFERENCES Aluno (id_aluno,CPF,RG)
ALTER TABLE aluno_curso ADD FOREIGN KEY(id_curso) REFERENCES Curso (id_curso)
ALTER TABLE Telefone_Professor ADD FOREIGN KEY(id_professor) REFERENCES Professor (id_professor)
ALTER TABLE Professor ADD FOREIGN KEY(id_especialidade) REFERENCES Especialidade (id_especialidade)
ALTER TABLE Professor ADD FOREIGN KEY(id_aula) REFERENCES Aula (id_aula)
ALTER TABLE Promocao ADD FOREIGN KEY(id_curso) REFERENCES Curso (id_curso)
ALTER TABLE Aluno ADD FOREIGN KEY(id_aluno_promocao) REFERENCES Aluno_Promocao (id_aluno_promocao)

You are reporting a user error

    
asked by anonymous 14.12.2018 / 14:24

2 answers

0

The foreign key must have the referenced fields that are primary key in the referenced table.

In this case you are referencing the Student table key and this key is made up of 3 fields: child_id , RG . So all tables that refer to the Student table should contain the 3 child id , CPF and RG fields. >

In the Student_Promotion table, for example, it looks like this:

FOREIGN KEY(id_aluno,CPF,RG) REFERENCES Aluno (id_aluno,CPF,RG)
    
14.12.2018 / 14:31
0

Errors found:

  • Student Table With more than 1 Primary key, you can have only 1 Primary key per table.
  • Foreign key declaration missing parameters

ps: The size of Varchar for CPF's and RG's that were not declared is also declared, if you want, you can change the value as long as you do not leave them blank.

Test SQL Now to see any questions I'm available.

-- Geração de Modelo físico
-- Sql ANSI 2003 - brModelo.



CREATE TABLE Data_Evento (
id_data_evento INTEGER PRIMARY KEY,
data_inicio DATE,
data_fim DATE
);

CREATE TABLE Hora_Evento (
id_hora INTEGER PRIMARY KEY,
id_evento INTEGER,
hora_inicio TIME,
hora_fim TIME
);

CREATE TABLE Usuario (
id_usuario INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(20),
RG VARCHAR(20),
usuario VARCHAR(255),
senha VARCHAR(255),
imagem LONGTEXT
);

CREATE TABLE Controle (
id_controle INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(20),
RG VARCHAR(20),
data_cadastro DATETIME,
data_entrada DATETIME,
data_saida DATETIME
);

CREATE TABLE aluno_curso (
id_aluno_curso INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(20),
RG VARCHAR(20),
id_curso INTEGER
);

CREATE TABLE Noticia (
id_noticia INTEGER PRIMARY KEY,
titulo VARCHAR(255),
autor VARCHAR(255),
descricao LONGTEXT,
data DATE,
fonte LONGTEXT,
imagem LONGTEXT,
imagem_2 LONGTEXT,
imagem_3 LONGTEXT
);

CREATE TABLE Telefone_Professor (
id_telefone_professor INTEGER PRIMARY KEY,
id_professor INTEGER,
telefone VARCHAR(9),
celular VARCHAR(10)
);

CREATE TABLE Evento (
id_evento INTEGER PRIMARY KEY,
id_data_evento INTEGER,
id_hora INTEGER,
titulo VARCHAR(255),
descricao LONGTEXT,
preco VARCHAR(10),
imagem LONGTEXT,
FOREIGN KEY(id_data_evento) REFERENCES Data_Evento (id_data_evento),
FOREIGN KEY(id_hora) REFERENCES Hora_Evento (id_hora)
);

CREATE TABLE Professor (
id_professor INTEGER PRIMARY KEY,
id_especialidade INTEGER,
id_telefone_professor INTEGER,
id_aula INTEGER,
nome VARCHAR(255),
sobrenome VARCHAR(255),
email VARCHAR(255),
Imagem LONGTEXT,
descricao LONGTEXT,
FOREIGN KEY(id_telefone_professor) REFERENCES Telefone_Professor (id_telefone_professor)
);

CREATE TABLE Aula (
id_aula INTEGER PRIMARY KEY,
tipo VARCHAR(255),
data DATE,
duracao TIME
);

CREATE TABLE Promocao (
id_promocao INTEGER PRIMARY KEY,
id_curso INTEGER,
titulo VARCHAR(255),
promocao VARCHAR(255),
validade DATE,
descricao LONGTEXT,
imagem LONGTEXT
);

CREATE TABLE Curso (
id_curso INTEGER PRIMARY KEY,
titulo VARCHAR(255),
descricao LONGTEXT,
carga VARCHAR(255),
imagem LONGTEXT
);

CREATE TABLE Aluno_Evento (
id_aluno_evento INTEGER PRIMARY KEY,
id_aluno INTEGER,
id_evento INTEGER,
CPF VARCHAR(20),
RG VARCHAR(20),
FOREIGN KEY(id_evento) REFERENCES Evento (id_evento)
);

CREATE TABLE Endereco (
id_endereco INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(20),
RG VARCHAR(20),
rua LONGTEXT,
numero VARCHAR(10),
cep VARCHAR(14),
pais VARCHAR(255),
estado VARCHAR(2),
cidade VARCHAR(255)
);

CREATE TABLE Aluno (
id_aluno INTEGER,
CPF VARCHAR(14),
RG VARCHAR(12),
id_usuario INTEGER,
id_controle INTEGER,
id_aluno_promocao INTEGER,
nome VARCHAR(255),
sobrenome VARCHAR(255),
email VARCHAR(255),
nacionalidade VARCHAR(255),
PRIMARY KEY(id_aluno),
FOREIGN KEY(id_usuario) REFERENCES Usuario (id_usuario),
FOREIGN KEY(id_controle) REFERENCES Controle (id_controle)
);

CREATE TABLE Telefone (
id_telefone INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(20),
RG VARCHAR(20),
telefone VARCHAR(9),
celular VARCHAR(10),
FOREIGN KEY(id_aluno,CPF,RG) REFERENCES Aluno (id_aluno,CPF,RG)
);

CREATE TABLE Modulo (
id_modulo INTEGER PRIMARY KEY,
id_curso INTEGER,
id_professor INTEGER,
titulo VARCHAR(255),
descricao LONGTEXT,
conteudo LONGTEXT,
imagem LONGTEXT,
imagem_2 LONGTEXT,
preco VARCHAR(100),
FOREIGN KEY(id_curso) REFERENCES Curso (id_curso),
FOREIGN KEY(id_professor) REFERENCES Professor (id_professor)
);

CREATE TABLE Especialidade (
id_especialidade INTEGER PRIMARY KEY,
especialidade LONGTEXT,
formacao LONGTEXT
);

CREATE TABLE Aluno_Promocao (
id_aluno_promocao INTEGER PRIMARY KEY,
id_aluno INTEGER,
CPF VARCHAR(20),
RG VARCHAR(20),
id_promocao INTEGER,
FOREIGN KEY(id_aluno,CPF,RG) REFERENCES Aluno (id_aluno,CPF,RG),
FOREIGN KEY(id_promocao) REFERENCES Promocao (id_promocao)
);

ALTER TABLE Hora_Evento ADD FOREIGN KEY(id_evento) REFERENCES Evento (id_evento)
ALTER TABLE Usuario ADD FOREIGN KEY(id_aluno,CPF,RG) REFERENCES Aluno (id_aluno,CPF,RG)
ALTER TABLE aluno_curso ADD FOREIGN KEY(id_curso) REFERENCES Curso (id_curso)
ALTER TABLE Telefone_Professor ADD FOREIGN KEY(id_professor) REFERENCES Professor (id_professor)
ALTER TABLE Professor ADD FOREIGN KEY(id_especialidade) REFERENCES Especialidade (id_especialidade)
ALTER TABLE Professor ADD FOREIGN KEY(id_aula) REFERENCES Aula (id_aula)
ALTER TABLE Promocao ADD FOREIGN KEY(id_curso) REFERENCES Curso (id_curso)
ALTER TABLE Aluno ADD FOREIGN KEY(id_aluno_promocao) REFERENCES Aluno_Promocao (id_aluno_promocao)

Some tips:

  • Never declare variables with the first capital letter, as far as I know it does not change practically anything, but for maintenance and organization the code gets better.

    Ex: [Wrong] CPF VARCHAR (255) [Correct] cpf VARCHAR (255)

14.12.2018 / 15:36