AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 140970
Accepted
dpolaristar
dpolaristar
Asked: 2016-06-11 10:14:47 +0800 CST2016-06-11 10:14:47 +0800 CST 2016-06-11 10:14:47 +0800 CST

Não é possível adicionar restrição de chave estrangeira

  • 772

Pelo que sei, deve funcionar, passei por outras questões semelhantes, mas parecia ser uma coisa diferente causando o mesmo erro.

CREATE TABLE Job
(
    JobNumber INT NOT NULL,
    JobName CHAR(30) NOT NULL,
    JobDescription CHAR(60) NOT NULL,
    Title Char(30) NOT NULL,
    PersonID INT NOT NULL,
   CONSTRAINT PK_JobNum PRIMARY KEY (JobNumber)
);

CREATE TABLE Employee
(
    PersonID INT NOT NULL,
    FirstName CHAR(30) NOT NULL,
    LastName CHAR(30) NOT NULL,
    CONSTRAINT Pk_PersonID PRIMARY KEY(PersonID),
    CONSTRAINT FK_Job_2_Employee FOREIGN KEY(PersonID) REFERENCES Job(PersonID)
);

CREATE TABLE Game
(
    GameNumber INT NOT NULL,
    Title CHAR(30) NOT NULL,
    System CHAR(30) NOT NULL,
    CONSTRAINT PK_GameNumber PRIMARY KEY(GameNumber),
    CONSTRAINT FK_Job_2_Game FOREIGN KEY(Title) REFERENCES Job(Title)
);

Ocorre um erro quando tento inicializar a segunda tabela. (E provavelmente chegará no terceiro.)

  • Várias pessoas podem ter o mesmo trabalho e uma pessoa pode ter vários empregos.
  • O JobNumbere o JobNamenão são a mesma coisa. Cada JobNumberum tem apenas um funcionário, e um único JobNumbertem apenas um JobName.
  • O JobNumbere o trabalho que uma pessoa tem não é a mesma coisa.
  • O número do trabalho e o tipo de trabalho não são a mesma coisa. Por exemplo, tanto o número de trabalho 1235 quanto o 1435 podem ter o trabalho "designer de nível".
mysql foreign-key
  • 3 3 respostas
  • 1626 Views

3 respostas

  • Voted
  1. Best Answer
    BillThor
    2016-06-11T17:24:21+08:002016-06-11T17:24:21+08:00

    Parece que você está colocando a chave estrangeira na tabela errada. A coluna PersonIDna Jobstabela deve fazer referência a PersonIDna Employeetabela.

    Se você estiver atribuindo pessoas a trabalhos, sua chave estrangeira original deve estar em JobId. Isso exigiria adicionar o JobIdà Employeestabela e remover o PersonIdda Jobstabela.

    Se Employeespode ter muitos Jobse Jobspode ter mais de um Employee, então você vai querer uma tabela de junção. Ele terá chaves estrangeiras para a tabela Jobse . EmployeesA chave primária da tabela de junção incluirá tanto o PersonIde JobId.

    • 3
  2. paparazzo
    2016-06-11T12:15:21+08:002016-06-11T12:15:21+08:00

    Job.PersonID não tem uma restrição única
    Eu acho que é isso que você quer ter
    Mas ainda está confuso em apenas uma pessoa pode ter um emprego
    Se for esse o caso, basta combinar Job e Employee

    CREATE TABLE Employee
    (
        PersonID INT NOT NULL,
        FirstName CHAR(30) NOT NULL,
        LastName CHAR(30) NOT NULL,
        CONSTRAINT Pk_PersonID PRIMARY KEY(PersonID)        
    );
    
    CREATE TABLE Job
    (
        JobNumber INT NOT NULL,
        JobName CHAR(30) NOT NULL,
        JobDescription CHAR(60) NOT NULL,
        Title Char(30) NOT NULL,
        PersonID INT NOT NULL,
        CONSTRAINT PK_JobNum PRIMARY KEY (JobNumber),
        CONSTRAINT FK_Job_2_Employee FOREIGN KEY(PersonID) REFERENCES Employee(PersonID)
    );
    

    E isso estragou:

    CONSTRAINT FK_Job_2_Game FOREIGN KEY(Title) REFERENCES Job(Title)
    

    Job.Title não é único
    Por que você teria um relacionamento entre dois caracteres (30)
    Isso é uma bagunça
    Você fornece requisitos contraditórios nos comentários
    Você precisa dar um passo atrás e fazer um design de dados adequado

    • 2
  3. dpolaristar
    2016-06-15T08:48:59+08:002016-06-15T08:48:59+08:00

    Graças às sugestões acima consegui resolver, combinei as duas soluções. (Uma é que eu estava fazendo isso de trás para frente, a outra que usar um Title é um Bad Id.

    Eu simplesmente substituí o título por um Game_ID. (Diferentes Game_IDs podem compartilhar um título semelhante e são números.)

    CREATE TABLE Employee
    (
        Employee_ID INT NOT NULL,
        First_Name CHAR(30) NOT NULL,
        Last_Name CHAR(30) NOT NULL,
        CONSTRAINT PK_Employee_ID PRIMARY KEY (Employee_ID)
    );
    CREATE TABLE Game
    (
        Game_ID INT NOT NULL,
        Title CHAR(30) NOT NULL,
        System CHAR(30) NOT NULL,
        CONSTRAINT PK_Game_ID PRIMARY KEY (Game_ID)
    );
    CREATE TABLE Job
    (
        Job_ID INT NOT NULL,
        Job_Type CHAR(30) NOT NULL,
        Job_Description CHAR(60) NOT NULL,
        Game_ID INT NOT NULL,
        Employee_ID INT NOT NULL,
        CONSTRAINT PK_Job_ID PRIMARY KEY (Job_ID),
        CONSTRAINT FK_Employee_2_Job FOREIGN KEY (Employee_ID) REFERENCES Employee (Employee_ID),
        CONSTRAINT FK_Game_2_Job FOREIGN KEY (Game_ID) REFERENCES Game (Game_ID)
    );
    
    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve