MySQLで関係を作成する方法


96

クラスでは、私たちはすべて「勉強中」のデータベースであり、誰もが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を「割り当て」たい(アカウントの所有者を示すため)。


48
「Accessの研究を拒否し、REALデータベースエンジン:MySQLを研究します」それが精神です。おめでとう= D
メタファニエル

2
外部キー制約は関係を実装せず、整合性を実装することに注意してください。アカウントテーブル内のaccount_idとcustomer_id間の関連付けは、それぞれのエンティティ間の関係を実装します。
reaanb

1
MyISAMではなく、InnoDBを使用するmysqlである限り、「それが精神です!」また、postgreqslには、MySQLに比べて注目に値するいくつかの興味深い機能があります。
jgmjgm

回答:


102

テーブルが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であることを指定する必要があります。見て、ここで詳細は。


私は、コマンドを使って確認することができ、InnoDBのは、デフォルトのストレージエンジンとして定義されている場合はENGINE = InnoDBの句を指定する必要はありませんことを、記事で見た(MySQLの> @@ default_storage_engineを選択します。)
アルン

80

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


3
あなたの答えが最善の解決策です
Omar

14
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対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テーブルの効果を提供するVIEWを作成することもできます。

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;

1
そうではca.なかったと思いますac.(3か所)。
楕円形のビュー

あなたはPRIMARY KEY (customer_id, account_id)それの後にコンマなしで書いた
theonlygusti

11

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

customer_id INT( 4 ) NOT NULL ,

成功する

customer_id INT( 10 ) NOT NULL ,

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


7

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

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

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

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

2

開始に役立ついくつかのリソースを以下に示します。http//www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabaseおよびhttp://code.tutsplus.com/articles/sql-for-beginners-part- 3-データベース関係--net-8561

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


apacheとmysqlをセットアップしてローカルリクエストのみを処理する場合は、それらを停止する必要はありません。これらの種類のサービスをインストールする場合、少なくともユーザーがソフトウェアファイアウォールをインストールする必要があります。そうは言っても、多くのホームルーターにはファイアウォールが組み込まれているため、ルーターにアクセスできる誰かがポートを開いていない限り、ポートは決して開いてはなりません。
Chris

1

知っておくべきルールの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; 

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

指定したスキーマについて説明してください。
samabcde 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.