2017-01-13 9 views
0

mySQL을 배우고 있습니다. 나는 그 주위에 내 머리를 잡기 위해 mySQL 워크 벤치와 리눅스 터미널을 혼합하여 사용하고있다. 나는 외래 키와 트리거로 고심하고있다. 나는 이것들 중 하나 또는 둘 모두를 잘못 이해했을지도 모른다고 생각하며 그것이 혼란의 원인이되고있다. 나는 누군가가 문제를 해결하기위한 코드를 제공 할 수는 없지만 내가 오해하고있는 것을 나에게 설명하기를 희망한다.MySQL 데이터베이스의 외래 키 및 트리거의 기본 사용

나는 Organization과 People이라고 불리는 두 개의 작은 테이블을 만들었습니다. 이 시나리오에서는 일대일 관계가 있습니다. 많은 사람들이 한 조직에서 일할 수 있지만 한 사람은 한 조직에서만 일할 수 있습니다. 따라서 조직 테이블 기본 키 'organisation_id'를 동일한 이름 'organisation_id'를 사용하여 외래 키로 인력 테이블에 삽입합니다. 필자는 사람들 테이블에서 외래 키를 사용하여 누가 어떤 조직에서 근무하는지 추적 할 수 있도록합니다. 내 목표는 다음이 테이블에 새로운 사람들을 추가 할 때 트리거를 사용하여 사람들의 외래 키를 자동으로 업데이트하여 누가 어떤 조직에서 근무하는지 추적합니다. 나는 이것을 어떻게하는지 알 수 없다. 사람 테이블에 항목을 추가하면 테이블에 누락 된 셀이 어떻게 표시 될 수 있습니까? 일대 다 관계와 외래 키를 오해 했습니까? 누구든지이 코드를 올바르게 코딩하는 방법을 보여줄 수 있고 내가 잘못한 곳을 말해 줄 수 있습니까? 아마 이것이 기본적인 질문 일지 모르지만 도움이 필요합니다. 그 적용

CREATE SCHEMA IF NOT EXISTS `learning` DEFAULT CHARACTER SET utf8 ; 
USE `learning` ; 


CREATE TABLE IF NOT EXISTS `learning`.`organisation` (
`organisation_id` INT UNSIGNED NOT NULL DEFAULT 1, 
`org_name` VARCHAR(45) NOT NULL, 
`org_website` VARCHAR(45) NULL, 
PRIMARY KEY (`organisation_id`)) 
ENGINE = InnoDB; 


CREATE TABLE IF NOT EXISTS `learning`.`people` (
`people_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(45) NULL, 
`job` VARCHAR(45) NULL, 
`organisation_id` INT UNSIGNED NOT NULL, 
PRIMARY KEY (`people_id`), 
INDEX `fk_organisation_id_idx` (`organisation_id` ASC), 
CONSTRAINT `fk_organisation_id` 
FOREIGN KEY (`organisation_id`) 
REFERENCES `learning`.`organisation` (`organisation_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 
+0

당신의 다 대일이 정확하다고 생각합니다. 트리거에 관해서는 '사용자 테이블에 항목을 추가하면 어떻게 테이블에 누락 된 셀을 찾아 낼 수 있습니까?' –

+0

새 행을 추가하기 위해 테이블을 업데이트하면 트리거 문을 새로 삽입 된 행의 people.organisation_id 셀을 자동으로 채우는 방법을 알 수 있습니다. 나는 그것이 AFTER INSERT 문이라고 생각하고있다. 그러나 그 문법은 조금 혼란 스럽다. 그림자가 무엇을 말하는지 생각해야합니다. –

+0

조직의 새로운 행? 아니면 사람들 테이블에 새 행이 있습니까? –

답변

1

당신은 제대로 외래 키의 개념을 이해하지만,하지 : MySQL의 워크 벤치에서

내 테이블 코드는 다음과 같습니다.

예, 당신이 organisationpeople를 연결하는 데 도움 만 (= 유효가 organisation 테이블에 존재)이 people 테이블에 유효한 organisation_id를 입력 할 수 있는지 확인합니다.

그러나 데이터베이스는 사람들이 어느 조직에 속해 있는지 스스로 알 수는 없습니다. 이것은 삽입물 자체에 제공해야하는 것입니다.

이 데이터베이스를 사용하는 응용 프로그램에는 데이터베이스에 people을 추가하는 양식이 있습니다. 이 양식에서 사용자가 속한 조직을 제공해야합니다. 외부 키 정의에

on deleteon update 절은 실제로 organisation 테이블에 적용 : organisation_id 필드가 삭제 된 경우 /를 organisation 테이블에 업데이트 한 후 작업은 people 테이블에 무엇을주의해야한다.

+0

감사 그림자. 나는 너와 함께 있다고 생각해.예를 들어, Java 응용 프로그램을 통해 액세스 된 경우 * Organization이라는 필드가있을 수 있습니다. 사용자가 입력 한 데이터는 조직 테이블에서 조회되고 organisation.organisation_id 값은 people.organisation_id 값으로 복사됩니다. 내가 제대로 이해 했는가? 이 자동화를 폼을 처리하는 스크립팅이 아니라 데이터베이스 끝에서 수행 할 수있는 방법이 있습니까? Java를 통해이 작업을 수행하고 데이터베이스가 어딘가에 서버에 있으면이 작업이 모두 느리게 실행됩니까? –

+0

네, 맞습니다. 결정이 데이터베이스에 알려지지 않은 경우 데이터베이스 레벨에 대해이 결정을 어떻게 내릴 것입니까? – Shadow

+0

데이터베이스의 테이블 간의 관계의 무결성이 인터페이스 코드의 논리에 미치면 왜 선언 된 외래 키를 사용하게 될까요? 예를 들어, 내 테이블에 외래 키 people.organisation_id가 없으면 외래 키로 선언되지 않은 '고용주'라는 다른 INT 열이 있었고 인터페이스 코드를 사용하여 organisation.organisation_id를 각각의 새 항목에 대한 people.employer 열에 추가하십시오. 어떻게 다른가? 나는 무엇을 이해하지 못합니까? –