문제

수업 시간에 우리는 모두 '공부'데이터베이스이며 모든 사람이 액세스를 사용하고 있습니다. 이것으로 지루함에 따라, 나는 나머지 클래스가하고있는 일을하려고 노력하고 있지만 액세스를 사용하는 대신 MySQL을 사용하여 원시 SQL 명령을 가지고 있습니다.

데이터베이스와 테이블을 만들었지 만 이제는 두 테이블 사이의 관계를 어떻게 만들려고합니까?

다음과 같은 두 테이블이있는 경우 다음과 같습니다.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

그리고

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    PRIMARY KEY ( customer_id )
)

두 테이블 사이에 '관계'를 어떻게 생성합니까? 각 계정을 '할당'한 Customer_id (누가 소유 한 사람을 나타냅니다).

도움이 되었습니까?

해결책

테이블이 innodB 인 경우 다음과 같이 만들 수 있습니다.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id ), 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
) ENGINE=INNODB;

MyISAM 엔진이 외국 키를 지원하지 않기 때문에 테이블이 InnoDB임을 지정해야합니다. 바라보다 여기 더 많은 정보를 위해서.

다른 팁

Ehogue가 말했듯이 이것을 생성 테이블에 넣으십시오.

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

또는 이미 테이블을 만든 경우 Alter Table 명령을 사용하십시오.

ALTER TABLE `accounts`
  ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE;

이러한 명령을 배우기 시작하는 한 가지 좋은 방법은 MySQL GUI 도구, 데이터베이스 작업을위한보다 "시각적"인터페이스를 제공합니다. 그 (Access의 방법)에 대한 진정한 이점은 GUI를 통해 테이블을 설계 한 후에는 실행중인 SQL을 보여 주므로 배울 수 있다는 것입니다.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

and

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
)

How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it).

당신은 스스로에게 1 ~ 1 관계 또는 여러 관계 중 1 개라고 스스로에게 물어봐야합니다. 즉, 모든 계정에는 고객이 있고 모든 고객은 계정을 가지고 있습니까? 또는 계정이없는 고객이 있습니다. 귀하의 질문은 후자를 의미합니다.

엄격한 1 ~ 1 관계를 원한다면 두 테이블을 병합하십시오.

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)

다른 경우, 두 테이블 사이의 관계를 만드는 올바른 방법은 관계 테이블을 만드는 것입니다.

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id)
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}

그런 다음 Customer_ID가 있고 계정 정보를 원한다면 CustomersAccounts 및 계정에 가입합니다.

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;

색인화로 인해 이것은 맹목적으로 빠릅니다.

또한 CompouittAccounts 테이블의 효과를 제공하는 뷰를 만들 수 있습니다.

CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca
        INNER JOIN accounts a ON ca.account_id=a.account_id
        INNER JOIN customers c ON ca.customer_id=c.customer_id;

Ehogue의 주석에 추가하면 두 테이블 일치에서 키 크기를 만들어야합니다. 보다는

customer_id INT( 4 ) NOT NULL ,

만들어라

customer_id INT( 10 ) NOT NULL ,

고객 테이블의 int 열이 int (10)인지 확인하십시오.

특정 MySQL 엔진은 외국 키를 지원합니다. 예를 들어, InnoDB는 외래 키를 기반으로 제약 조건을 설정할 수 있습니다. 다른 하나에 부양 가족이있는 한 테이블의 항목을 삭제하려고하면 삭제가 실패합니다.

MyISAM과 같이 MySQL에서 테이블 유형을 사용하는 경우 외래 키를 지원하지 않는 경우 다이어그램 및 쿼리를 제외한 테이블을 연결하지 않습니다.

예를 들어, 쿼리에서 선택 문의 두 테이블을 조인으로 연결합니다.

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);

다음은 시작하는 데 도움이되는 몇 가지 리소스입니다. http://www.anchor.com.au/hosting/support/creatingaquickmysqlrelationalDatabase 그리고 http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships-net-8561

또한 다른 사람들이 말했듯이 GUI를 사용하십시오 - 컴퓨터에서 Server -Software (Apache 및 MySQL)를 실행하는 XAMPP (또는 WAMP)를 다운로드하고 설치하십시오. 그런 다음 브라우저에서 // localhost로 이동하면 phpmyadmin을 선택하여 MySQL 데이터베이스 작업을 시각적으로 시각적으로 작업하십시오. 위에서 언급했듯이 InnoDB를 사용하여 요청한대로 관계를 맺을 수 있습니다. 데이터베이스 테이블로 수행하는 작업을 쉽게 볼 수 있습니다. 완료되면 Apache 및 MySQL 서비스를 중지하는 것을 잊지 마십시오. 포트를 열 수있어 해킹/악의적 인 위협에 노출 될 수 있습니다.

당신이 알아야 할 규칙 중 하나는 참조하려는 테이블 열이 참조 테이블과 동일한 데이터 유형을 가지고 있어야한다는 것입니다. 2 MySQL을 사용하기로 결정한 경우 MySQL에서 달성하려는 엔진이기 때문에 InnoDB 엔진을 사용해야합니다.

벨로우는 코드를 시도해 보지만이 질문에 대한 첫 번째 사람들은 100% 큰 답변을 제공했으며 모두 고려하십시오.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY (account_id)
)ENGINE=InnoDB;

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
     PRIMARY KEY ( account_id ), 
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
)ENGINE=InnoDB; 
create table departement(
    dep_id      int primary key auto_increment,
    dep_name    varchar(100) not null,
    dep_descriptin      text,
    dep_photo       varchar(100) not null,
    dep_video       varchar(300) not null
);

create table newsfeeds(
    news_id         int primary key auto_increment,
    news_title      varchar(200) not null,
    news_description    text,
    news_photo          varchar(300) ,
    news_date           varchar(30) not null,
    news_video          varchar(300),
    news_comment        varchar(200),
    news_departement    int foreign key(dep_id) references departement(dep_id)
);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top