Dúvida sobre Banco de Dados

MySQL

Python

Banco de Dados

20/03/2023

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

Curtidas 0

Respostas

Felipe

Felipe

20/03/2023

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;
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

20/03/2023

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.
GOSTEI 0
Felipe

Felipe

20/03/2023

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