MySQL データベースで「1 対 1」の関係を実現しようとしています。たとえば、Users テーブルと Accounts テーブルがあるとします。ユーザーが持つことができるアカウントは 1 つだけであることを確認したいと思います。また、ユーザーごとに 1 つのアカウントしか存在できないこと。
これには 2 つの解決策が見つかりましたが、何を使用すればよいかわかりません。他のオプションはありますか。
最初の解決策:
DROP DATABASE IF EXISTS test;
CREATE DATABASE test CHARSET = utf8 COLLATE = utf8_general_ci;
USE test;
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(45) NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
CREATE TABLE accounts(
id INT NOT NULL AUTO_INCREMENT,
account_name VARCHAR(45) NOT NULL,
user_id INT UNIQUE,
PRIMARY KEY(id),
FOREIGN KEY(user_id) REFERENCES users(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
この例では、users の主キーを指す accounts の外部キーを定義します。次に、外部キーを UNIQUE にするため、アカウントに同一のユーザーが 2 人存在することはありません。テーブルを結合するには、次のクエリを使用します。
SELECT * FROM users JOIN accounts ON users.id = accounts.user_id;
2番目の解決策:
DROP DATABASE IF EXISTS test;
CREATE DATABASE test CHARSET = utf8 COLLATE = utf8_general_ci;
USE test;
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(45) NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
CREATE TABLE accounts(
id INT NOT NULL AUTO_INCREMENT,
account_name VARCHAR(45) NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(id) REFERENCES users(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
この例では、主キーから別のテーブルの主キーを指す外部キーを作成します。主キーはデフォルトで UNIQUE であるため、この関係は 1 対 1 になります。テーブルを結合するには、これを使用できます。
SELECT * FROM users JOIN accounts ON users.id = accounts.id;
今質問:
- MySQL で 1 対 1 の関係を作成する最良の方法は何ですか?
- この2つ以外に解決策はありますか?
私はMySQL Workbenchを使用しています.EERダイアグラムで1対1の関係を設計し、MySQL WorkbenchにSQLコードを生成させると、1対多の関係が得られます:Sそれが私を混乱させるものです:S
そして、これらのソリューションのいずれかを MySQL Workbench EER ダイアグラムにインポートすると、関係が 1 対多として認識されます :S これもややこしいです。
では、MySQL DDL で 1 対 1 の関係を定義する最良の方法は何でしょうか。そして、これを達成するためにどのようなオプションがありますか?