Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite pessoal (ou boa madruada) hehehe!
Seguinte, estou aqui quebrando cabeça pois começei a brincar com Procedures e Trigger (sim, chegou o momento certo de usá-las). Nesta brincadeira toda, obviamente estou tendo alguns problemas, codificamente falando.
Preciso resolver o seguinte problema: Tenho uma tabela n -> n com seus respectivos FK's, certo? Só que, eu não posso deixar que o usuário possa remove-lo, pois seu ID está sendo relacionado na tabela de n -> n, correto?
Pensei em criar uma Trigger para isso, mas não irá resolver meu problema, pois não é possível fazer seleção dos registros. Pois bem, a solução são as Procedures, só que to batendo cabeça com isso e não consigo chegar na solução. O que preciso fazer é o seguinte: Selecionar idTabela1, idTabela3, fazer suas respectivas comparações de valores, e por último uma condicional, é basicamente isso de forma resumida.
Se não for muito isso, qual seria a melhor solução?
Também acho que uma integridade relacional funcionaria melhor do que Triggers ou Procedures...
De qualquer forma, a SP não vai impedir que um registro seja excluido acidentalmente, uma CONSTRAINT ou uma TRIGGER (usando uma técnica de "chave duplicada"), sim.
Trigger é melhor numa situação do tipo :
Um PEDIDO que tenha ITEM_DE_PEDIDO numa situação de enviado não pode ser deletado.
Motta e Prog
Sim, mas sempre que faço a modelagem do meu banco no MySQL Workbench, quando vou inserir o código SQL dá mensagem de erro referente as minhas FK's. Sou obrigado a colocar valores das ACTIONS (ON UPDATE, ON DELETE, RESTRICT, SET NULL) ?
Você quer apagar tudo em cascata?
Não. Eu quero que não seja possível remover um registro da FK, entendeu? Olha o que eu fiz:
CREATE TABLE IF NOT EXISTS `consultar`.`schedules` (
`idschedules` INT NOT NULL AUTO_INCREMENT ,
`idPacient` INT NOT NULL ,
`idDoctor` INT UNSIGNED NOT NULL ,
`day` DATE NOT NULL ,
`hour` TIME NOT NULL ,
`typeScheduling` INT(1) NOT NULL COMMENT 'Tipo de Agendamento\\n0 - Consulta;\\n1 - Exame\\n2 - Revisão' ,
`status` INT(1) NOT NULL DEFAULT 0 COMMENT 'Status da Consulta: \\n0 - Marcada; \\n1 - Desmarcada' ,
PRIMARY KEY (`idschedules`, `idPacient`, `idDoctor`) ,
INDEX `fk_schedules_pacients_idx` (`idPacient` ASC) ,
INDEX `fk_schedules_users1_idx` (`idDoctor` ASC) ,
CONSTRAINT `fk_schedules_pacients`
FOREIGN KEY (`idPacient` )
REFERENCES `consultar`.`pacients` (`idPacient` )
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_schedules_users1`
FOREIGN KEY (`idDoctor` )
REFERENCES `consultar`.`users` (`idDoctor` )
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB
Nisso, sempre gera o erro:
>
#1005 - Can't create table 'consultar.schedules' (errno: 150)
O que faço?
...
idPacient INT NOT NULL ,
idDoctor INT UNSIGNED NOT NULL ,
...
idPacient e idDoctor em suas tabelas de origem são iguais?
Escrevi o SQL errado, ao invez de ser tabela doctors, é a tabela users, mas já arrumei este erro.
Mas respondendo a sua pergunta: Sim, na tabela users tem o idUser e a mesma coisa na tabela pacients.
Você tem certeza absoluta que na sua tabela Pacients a coluna idPacient esta como INT NOT NULL?
e
Você tem certeza absoluta que na sua tabela Doctors a coluna idDoctor esta como INT UNSIGNED NOT NULL?
>
Você tem certeza absoluta que na sua tabela Pacients a coluna idPacient esta como INT NOT NULL?
e
Você tem certeza absoluta que na sua tabela Doctors a coluna idDoctor esta como INT UNSIGNED NOT NULL?
Agora deu certo. Acontece que nas minhas duas tabelas estavam SIM com INT UNSIGNED NOT NULL, porém na minha segunda FK (idUser) estava sem UNSIGNED, impedindo de criar a tabela, agora veja como ficou:
CREATE TABLE IF NOT EXISTS `consultar`.`schedules` (
`idschedules` INT NOT NULL AUTO_INCREMENT ,
`idUser` INT UNSIGNED NOT NULL ,
`idPacient` INT UNSIGNED NOT NULL ,
`day` DATE NOT NULL ,
`hour` TIME NOT NULL ,
`typeScheduling` INT(1) NOT NULL COMMENT 'Tipo de Agendamento\\n0 - Consulta;\\n1 - Exame\\n2 - Revisão' ,
`status` INT(1) NOT NULL DEFAULT 0 COMMENT 'Status da Consulta: \\n0 - Marcada; \\n1 - Desmarcada' ,
PRIMARY KEY (`idschedules`) ,
INDEX `fk_schedules_users_idx` (`idUser` ASC) ,
INDEX `fk_schedules_pacients1_idx` (`idPacient` ASC) ,
CONSTRAINT `fk_schedules_users`
FOREIGN KEY (`idUser` )
REFERENCES `consultar`.`users` (`idUser` )
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_schedules_pacients1`
FOREIGN KEY (`idPacient` )
REFERENCES `consultar`.`pacients` (`idPacient` )
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
COMMENT = 'Tabela de agendamentos para consultas / exames.'
Agora o que preciso fazer é tratar o erro na aplicação na hora de remover algum paciente / usuário.
>
Agora o que preciso fazer é tratar o erro na aplicação na hora de remover algum paciente / usuário.
:thumbsup:
Muito obrigado a todos por me ajudarem.
Tente usar o DELETE RULE