質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2053閲覧

mysqlの外部キー制約について

makibi5577

総合スコア112

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2015/11/30 04:31

sql

1create table test_table_1( 2 id int(11) not null, 3 name varchar(30) not null, 4 primary key (id) 5)charset=utf8; 6 7 8create table test_table_2( 9 id int(11) not null, 10 name varchar(30) not null, 11 age int(11) not null, 12 persontext text not null, 13)charset=utf8;

mysqlで上記のテーブルで、「test_table_1」を被参照元として「id」で外部キー制約をつけたのですが、
「test_table_2」で、idとnameの入力の関連性に制限を持たせる方法が知りたいです。

例えば「test_table_1」のデータを参照して、
「test_table_2」でid「5」には必ずname「武田」が入らないとエラーになる制約は可能ですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

MySQLの場合、外部キー制約以上に複雑な制約をかけようとすればストアードプロシージャを使うぐらいしか手がありません。

というより、test_table_2でtest_table_1の関連付けしたデータを入れるぐらいなら、そのままtest_table_2には入れずに、必要になるたびにtest_table_1と連携してデータを取るという方が、正規化もされているのでおすすめです。

投稿2015/11/30 04:40

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makibi5577

2015/12/01 07:49

回答ありがとうございます。
guest

0

たとえで、 test_table_2 テーブルに name 列は削って、名称は test_table_1.name を使うという鉄の掟にすれば済むことかと想像します。
狭い日本をとっても、現実では結婚した妹が再婚したり出来るので、現実にそぐわないモデルを云々してもどの程度有益かは疑問です。

投稿2015/11/30 10:04

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makibi5577

2015/12/01 07:48

回答ありがとうございます。
guest

0

PKを変えても良いのであれば

SQL

1CREATE TABLE `test_table_1` ( 2 `id` INT(11) NOT NULL, 3 `name` VARCHAR(30) NOT NULL, 4 PRIMARY KEY (`id`, `name`) 5) 6COLLATE='utf8_general_ci' 7ENGINE=InnoDB 8; 9 10CREATE TABLE `test_table_2` ( 11 `id` INT(11) NOT NULL, 12 `name` VARCHAR(30) NOT NULL, 13 `age` INT(11) NOT NULL, 14 `persontext` TEXT NOT NULL, 15 INDEX `FK_test_table_2_test_table_1` (`id`, `name`), 16 CONSTRAINT `FK_test_table_2_test_table_1` FOREIGN KEY (`id`, `name`) REFERENCES `test_table_1` (`id`, `name`) 17) 18COLLATE='utf8_general_ci' 19ENGINE=InnoDB 20; 21
INSERT INTO `aaaaaa`.`test_table_2` (`id`, `name`, `age`, `persontext`) VALUES (5, '鈴木', 12, 'ああああ'); /* SQL エラー (1452): Cannot add or update a child row: a foreign key constraint fails (`aaaaaa`.`test_table_2`, CONSTRAINT `FK_test_table_2_test_table_1` FOREIGN KEY (`id`, `name`) REFERENCES `test_table_1` (`id`, `name`)) */

となります。

投稿2015/11/30 05:15

anonymouskawa

総合スコア856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makibi5577

2015/12/01 07:48

回答ありがとうございます。
makibi5577

2015/12/02 17:07 編集

ミス投稿しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問