Dúvida sobre Banco de Dados

20/03/2023

0

Estou tentando fazer um trabalho de faculdade no qual preciso fazer um projeto de BD relacional, porém sempre acabo tendo o seguinte erro ao dar UPDATE no banco:
Cannot add or update a child row: a foreign key constraint fails
Gostaria de ajuda para saber em que parte do código/banco está dando problema. Utilizando a linguagem Python

Segue o Código abaixo:

def update():

        match txt:
            case "Código": # Código
                fazTipo()
                fazData()
                comando = f''UPDATE ingresso SET'' \
                          f'' cod = "{codigo.get()}",'' \
                          f'' WHERE cod = "{int(Descricao.get())}"''
                cursor.execute(comando)
                conexao.commit()  ##  <<<< editar o banco de dados

                novaReservaMsgmLabel.configure(text=f''Dados atualizados com sucesso: '' \
                                              f''\n\nAssento: {assento.get()}'' \
                                              f''\nValor: R${valor.get()}'' \
                                              f''\nNome: {nome.get()}'' \
                                              f''\nSala: {sala.get()}'' \
                                              f''\nTipo: '' \
                                              f''\n\n=======Adcionado======='' \
                                              f''\nData:'' \
                                              f''\nHora:'' \
                                              f''\n======================='')
                return 0

            case "Nome": # Nome

                fazTipo()
                fazData()

                comando = f''UPDATE ingresso SET'' \
                          f'' nome = "{nome.get()}",''\
                          f'' sala_sala = "{sala.get()}",'' \
                          f'' sala_assento = "{assento.get()}",'' \
                          f'' WHERE nome = "{Descricao.get()}" \
                          AND sala_sala = "{DescricaoParaSala.get()}"\
                          AND assento_assento = "{DescricaoParaAssento.get()}"''
                print(comando)
                cursor.execute(comando)
                conexao.commit()  ##  <<<< editar o banco de dados

                novaReservaMsgmLabel.configure(text=f''Dados atualizados com sucesso: '' \
                                               f''\n\nAssento: {assento.get()}'' \
                                               f''\nValor: R${valor.get()}'' \
                                               f''\nNome: {nome.get()}'' \
                                               f''\nSala: {sala.get()}'' \
                                               f''\nTipo: '' \
                                               f''\n\n=======Adcionado======='' \
                                               f''\nData:'' \
                                               f''\nHora:'' \
                                               f''\n======================='')
                return 0

            case "Sala": # Sala

                fazTipo()
                fazData()

                comando = f''UPDATE sala SET'' \
                          f'' sala = "{sala.get()}",'' \
                          f'' WHERE sala = "{Descricao.get()}"''
                print(comando)
                cursor.execute(comando)
                conexao.commit()  ##  <<<< editar o banco de dados

                novaReservaMsgmLabel.configure(text=f''Dados atualizados com sucesso: '' \
                                                    f''\n\nAssento: {assento.get()}'' \
                                                    f''\nValor: R${valor.get()}'' \
                                                    f''\nNome: {nome.get()}'' \
                                                    f''\nSala: {sala.get()}'' \
                                                    f''\nTipo: '' \
                                                    f''\n\n=======Adcionado======='' \
                                                    f''\nData:'' \
                                                    f''\nHora:'' \
                                                    f''\n======================='')
                return 0

            case "Assento": #Assento

                fazTipo()
                fazData()

                comando = f''UPDATE assento SET'' \
                          f'' assento = "{assento.get()}",'' \
                          f'' WHERE assento = "{Descricao.get()}"''
                cursor.execute(comando)
                conexao.commit()  ##  <<<< editar o banco de dados

                novaReservaMsgmLabel.configure(text=f''Dados atualizados com sucesso: '' \
                                              f''\n\nAssento: {assento.get()}'' \
                                              f''\nValor: R${valor.get()}'' \
                                              f''\nNome: {nome.get()}'' \
                                              f''\nSala: {sala.get()}'' \
                                              f''\nTipo: '' \
                                              f''\n\n=======Adcionado======='' \
                                              f''\nData:'' \
                                              f''\nHora:'' \
                                              f''\n======================='')
                return 0

            case _:
                novaReservaMsgmLabel.configure(text=f''Opção : --> {Descricao.get()} <--\nnão é válida.\nPor favor confira a escolha \ne \ntente novamente.'')
                return 0


Segue o Banco de Dados (MySQL):

-- MySQL Script generated by MySQL Workbench
-- Mon Mar 20 15:10:46 2023
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=''ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`assento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`assento` (
  `assento` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`assento`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`sala`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`sala` (
  `sala` INT NOT NULL,
  `assento_assento` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`sala`),
  INDEX `fk_sala_assento1_idx` (`assento_assento` ASC) VISIBLE,
  CONSTRAINT `fk_sala_assento1`
    FOREIGN KEY (`assento_assento`)
    REFERENCES `mydb`.`assento` (`assento`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`ingresso`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`ingresso` (
  `cod` INT NOT NULL AUTO_INCREMENT,
  `nome` VARCHAR(45) NOT NULL,
  `valor` DECIMAL(5,0) NULL,
  `tipo_entrada` VARCHAR(45) NULL,
  `data` DATE NULL,
  `hora` TIME NULL,
  `sala_sala` INT NOT NULL,
  `assento_assento` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`cod`, `sala_sala`, `assento_assento`),
  INDEX `fk_ingresso_sala1_idx` (`sala_sala` ASC) VISIBLE,
  INDEX `fk_ingresso_assento1_idx` (`assento_assento` ASC) VISIBLE,
  CONSTRAINT `fk_ingresso_sala1`
    FOREIGN KEY (`sala_sala`)
    REFERENCES `mydb`.`sala` (`sala`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_ingresso_assento
Felipe

Felipe

Responder

Posts

20/03/2023

Felipe

Continuação do código SQL (foi cortado)

FOREIGN KEY (`assento_assento`)
    REFERENCES `mydb`.`assento` (`assento`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Responder

20/03/2023

Arthur Heinrich

Acredito que o seu problema esteja no fato de que a foreign key foi criada na tabela errada.

Uma sala pode conter vários assentos. Logo, é o assento que faz referência à sala e não o contrário.

Pense sempre na relação "1 para n". O "1" é representado pela tabela que possui a PK, que garante a unicidade.
O "n" indica que, para uma mesma chave, neste caso, a PK da sala, pode aparecer em múltiplos registros de assento que compõe a sala.

No seu modelo, invertido. A sala faz referência a um único assento. Para cadastrar a sala, o assento precisa ser criado com antecedência, o que não faz sentido.
Responder

20/03/2023

Felipe

Daí eu precisaria criar uma coluna "Assentos" em Ingresso, ou teria que fazer outro processo?
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar