クラスでは、私たちはすべて「研究」データベースであり、誰もが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を「割り当て」てもらいたい(所有者を示すため)。
テーブルが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 をご覧ください。
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が表示されることです。したがって、そこから学ぶことができます。
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;
Ehogueによるコメントに追加して、両方のテーブルのキーのサイズを一致させる必要があります。のではなく
customer_id INT( 4 ) NOT NULL ,
成功する
customer_id INT( 10 ) NOT NULL ,
また、customersテーブルのint列もint(10)であることを確認してください。
特定のMySQLエンジンは外部キーをサポートします。たとえば、InnoDBは外部キーに基づいて制約を確立できます。別のテーブルに依存関係があるテーブルのエントリを削除しようとすると、削除は失敗します。
MyISAMなど、外部キーをサポートしないテーブルタイプをMySQLで使用している場合、ダイアグラムとクエリ以外のテーブルをリンクしないでください。
たとえば、クエリでは、選択ステートメント内の2つのテーブルを結合でリンクします。
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を使用します。サーバーソフトウェア(ApacheとmySQL)をコンピューターで実行するXampp(またはWamp)をダウンロードしてインストールしてください。次に、ブラウザーで// localhostに移動したら、PHPMyAdminを選択して、mySQLデータベースの視覚的な操作を開始します。上記のように、innoDBを使用して、要求に応じて関係を作成できます。データベーステーブルで何をしているかを簡単に確認できます。終了したら、ApacheおよびmySQLサービスを停止することを忘れないでください-これらは、ハッキング/悪意のある脅威にさらされる可能性のあるポートを開く可能性があります。
知っておく必要がある規則の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;
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)
);