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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

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

Q&A

解決済

2回答

3781閲覧

MySQLの外部キー制約:子テーブルの外部キー項目にNULLのinsertの可否について。

tt02

総合スコア36

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

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

0グッド

0クリップ

投稿2020/10/18 02:18

MySQLの外部キー制約についてです。

外部キー制約のつけた列に、制約の例外としてNULL値を許容したいと思っています。
方法はありますでしょうか。

■行った事。
外部キー制約のつけた列に既にNULLlが既に入っている場合、制約をつけることは出来ました。
しかし、制約をつけた後、その子テーブルの外部キー制約を張った列にNULLをinsertしようとすると、外部キー制約違反と叱られます。

■自分の考えた代替案
nullに変わる意味をもつ値を親側の表に持たせる。例えば、親側に、primary key が0で、項目名が【なし】など。

外部キー制約はどうしてもつけたいとき、その外部キーフィールド(子テーブル側)にnull値のinsertを許容する方法はないのでしょうか。
※参考:親側はテーブルは、追加されることはあっても削除・変更されることは、運用上ありません。

どうぞ、よろしくお願いします。

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

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

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

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

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

guest

回答2

0

sql

1create table parent_tbl(pid int primary key,pval int); 2create table child_tbl(cid int primary key,cval int,pid int null,index(pid),foreign key(pid) references parent_tbl(pid) on delete set null on update cascade); 3insert into parent_tbl values 4(1,1000), 5(2,1001), 6(3,1002); 7insert into child_tbl values 8(1,2000,1), 9(2,2001,1), 10(3,2002,2), 11(4,2003,3), 12(5,2004,null);

として

SQL

1delete from parent_tbl where pid=3;

とするとchild_tblのcid=4のpidがnullになります
また

SQL

1update parent_tbl set pid=5 where pid=2;

とするとchild_tblのcid=3のpidが5になります

投稿2020/10/18 03:08

編集2020/10/18 03:28
yambejp

総合スコア116724

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

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

0

ベストアンサー

外部キー制約のつけた列に既にNULLlが既に入っている場合、制約をつけることは出来ました。

しかし、制約をつけた後、その子テーブルの外部キー制約を張った列にNULLをinsertしようとすると、外部キー制約違反と叱られます。

外部キーは親テーブルにキーが登録されているかチェックする機能ですから、当然怒られます。
小テーブルに外部キーは設定できませんから、小テーブルのキーにNULL以外が設定されたら親テーブルに存在チェックを入れてください。

投稿2020/10/18 02:28

Orlofsky

総合スコア16417

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

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

tt02

2020/10/18 02:32

明快なご回答ありがとうございます。 つまり、nullを入れたい場合は、外部キー制約を使うのではなく、 プログラムによるチェックということですね。
Orlofsky

2020/10/18 02:38

そうです。 実務である程度大きなシステムになると外部キーはほとんど使いません。 外部キーを使うことで遅くなるし、外部キーを使わないでもデータの整合性を取れるレベルのプログラママーを用意します。
tt02

2020/10/18 03:08

大変すっきりしました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問