108

クラスでは、全員がデータベースを「勉強」しており、全員が 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 を「割り当て」たい (所有者を示すため)。

4

8 に答える 8

117

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

于 2008-11-04T00:32:48.270 に答える
89

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 が表示されるため、そこから学ぶことができることです。

于 2008-11-04T00:37:52.223 に答える
11

ehogue によるコメントに追加すると、両方のテーブルのキーのサイズを一致させる必要があります。それよりも

customer_id INT( 4 ) NOT NULL ,

成功する

customer_id INT( 10 ) NOT NULL ,

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

于 2008-11-04T00:36:10.650 に答える
9

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

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

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

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
于 2008-11-04T01:02:30.503 に答える
1

知っておく必要があるルールの 1 つは、参照するテーブルの列は、参照テーブルと同じデータ型でなければならないということです。2 mysql を使用する場合は、 InnoDB Engine を使用する必要があります。これは、質問によると、 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; 
于 2013-01-26T10:30:49.323 に答える