MySQLで関係を作成する方法
-
06-07-2019 - |
質問
クラスでは、私たちはすべて「研究」データベースであり、誰もが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 )
)
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,
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であることを指定する必要があります。詳細については、こちらをご覧ください。
他のヒント
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)
);