web-dev-qa-db-ja.com

MySQLで関係を作成する方法

クラスでは、私たちはすべて「研究」データベースであり、誰もがAccessを使用しています。これに飽きて、私はクラスの残りの部分がやっていることをしようとしていますが、Accessを使用する代わりにMySQLで生のSQLコマンドを使用しています。

データベースとテーブルを作成できましたが、2つのテーブル間にリレーションシップを作成するにはどうすればよいですか?

このような2つのテーブルがある場合:

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 )
)

2つのテーブル間に「関係」を作成するにはどうすればよいですか?各アカウントには、1人のcustomer_idを「割り当て」てもらいたい(所有者を示すため)。

86
Josh Hunt

テーブルが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であることを指定する必要があります。詳細は here をご覧ください。

92
Eric Hogue

ehogueが言ったように、これをCREATE TABLEに入れてください

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;

これらのコマンドの学習を開始する1つの良い方法は、 MySQL GUIツール を使用することです。これにより、データベースを操作するためのより「視覚的な」インターフェースが得られます。それに対する本当の利点は(Accessのメソッドよりも)、GUIを使用してテーブルを設計した後、実行するSQLが表示されることです。したがって、そこから学ぶことができます。

72
nickf
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の関係を持ちたい場合は、2つのテーブルをマージするだけです。

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,
)

それ以外の場合、2つのテーブル間のリレーションシップを作成する正しい方法は、リレーションシップテーブルを作成することです。

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;

インデックス作成のため、これは目もくらむほど速くなります。

また、ビューを作成して、結合されたcustomersaccountsテーブルの効果を提供しながら、それらを別々に保持することもできます。

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;
11
user3842431

Ehogueによるコメントに追加して、両方のテーブルのキーのサイズを一致させる必要があります。のではなく

customer_id INT( 4 ) NOT NULL ,

成功する

customer_id INT( 10 ) NOT NULL ,

また、customersテーブルのint列もint(10)であることを確認してください。

9
Zak

特定のMySQLエンジンは外部キーをサポートします。たとえば、InnoDBは外部キーに基づいて制約を確立できます。別のテーブルに依存関係があるテーブルのエントリを削除しようとすると、削除は失敗します。

MyISAMなど、外部キーをサポートしないテーブルタイプをMySQLで使用している場合、ダイアグラムとクエリ以外のテーブルをリンクしないでください。

たとえば、クエリでは、選択ステートメント内の2つのテーブルを結合でリンクします。

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

開始に役立つリソースを次に示します。 http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase および http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

また、他の人が言ったように、GUIを使用します。サーバーソフトウェア(ApacheとmySQL)をコンピューターで実行するXampp(またはWamp)をダウンロードしてインストールしてください。次に、ブラウザーで// localhostに移動したら、PHPMyAdminを選択して、mySQLデータベースの視覚的な操作を開始します。上記のように、innoDBを使用して、要求に応じて関係を作成できます。データベーステーブルで何をしているかを簡単に確認できます。終了したら、ApacheおよびmySQLサービスを停止することを忘れないでください-これらは、ハッキング/悪意のある脅威にさらされる可能性のあるポートを開く可能性があります。

2
user3659515

知っておく必要がある規則の1つは、参照するテーブル列が、参照するテーブルと同じデータ型である必要があるということです。 2 mysqlを使用することにした場合、InnoDBエンジンを使用する必要があります。これは、あなたの質問によると、mysqlで達成したいことをサポートするエンジンだからです。

この質問に最初に答えた人は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; 
1
Musa
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)
);
0
Anayat