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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

5回答

463閲覧

MySQLのテーブル作成についてpart1

meidochan

総合スコア15

MySQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2017/07/18 07:37

編集2017/07/18 08:08

DROP DATABASE IF EXISTS kadai04;
CREATE DATABASE kadai04;
use kadai04
-- テーブル順番1
-- 店側商品テーブル(T_VendorShohin)作成
-- F_ShohinName(商品名)
-- F_ShohinPrice(単価)
-- F_JANCode(JANコード)
-- F_ConTax(消費税)
-- F_TaxRate(税率)
-- F_TaxAmount(税額)
CREATE TABLE T_VendorShohin(
F_ShohinName nvarchar(30) not null primary key,
F_ShohinPrice int(7) unsigned not null,
F_JANCode int(13) unsigned unique not null,
F_ConTax double unsigned not null default 1.08,
F_TaxRate double unsigned not null,
F_TaxAmount int(3) unsigned not null
);
-- テーブル順番2
-- 企業テーブル作成(T_Company)作成
-- F_ShopNum(店舗No)
-- F_CompanyName(企業名)
-- F_ShopName(店舗名)
-- F_ShopTel(店舗電話番号)
CREATE TABLE T_Company(
F_ShopNum int(3) unsigned zerofill not null auto_increment primary key,
F_CompanyName nvarchar(20) not null,
F_ShopName nvarchar(10) unique not null,
F_ShopTel char(13) unique not null
);
-- テーブル順番3
-- nanaco基本情報テーブル(T_NanacoProfile)作成
-- F_NanacoNum(nanacoナンバー)
-- F_NanacoBalance(nanaco残高ポイント)
CREATE TABLE T_NanacoProfile(
F_NanacoNum int(16) unsigned not null auto_increment primary key,
F_NanacoBalance int(7) unsigned not null default 0
);
-- テーブル順番4
-- カレンダーテーブル(T_Calendar)
-- F_Date(日時、日付)
-- F_Weather(その日の天気)
-- F_CampaignInfo(キャンペーン情報)
CREATE TABLE T_Calendar(
F_Date timestamp not null primary key default 0,
F_Weather nvarchar(10) not null,
F_CampaignInfo nvarchar(30)
);
-- テーブル順番5
-- nanacoGetポイントテーブル(T_NanacoGetPoint)作成
-- F_nanacoNum(nanacoナンバー)
-- F_Date(日付、日時)
-- F_ShopNum(店舗No)
-- F_TradeNum(取引No)
-- F_NanacoGetPoint(nanacoGetポイント)
CREATE TABLE T_NanacoGetPoint(
F_NanacoNum int(16) unsigned not null auto_increment,
F_Date timestamp not null default 0,
F_ShopNum int(3) unsigned zerofill not null,
F_TradeNum int(4) unsigned zerofill not null,
F_NanacoGetPoint int(4) unsigned not null,
primary key(F_NanacoNum,F_Date),
foreign key(F_NanacoNum) references T_NanacoProfile(F_NanacoNum)
);
-- テーブル順番6
-- 担当者テーブル(T_Staff)作成
-- F_StaffName(担当者名)
-- F_ShopNum(店舗no)
CREATE TABLE T_Staff(
F_ShopNum int(3) unsigned zerofill not null,
F_StaffName nvarchar(12) not null,
primary key(F_ShopNum,F_StaffName),
foreign key(F_ShopNum) references T_Company(F_ShopNum)
);
-- テーブル順番7
-- 取引テーブル(F_TradeList)作成
-- F_TradeNum(取引No)
-- F_Date(日付、日時)
-- F_ReceiptNum(レシートナンバー)
-- F_RegiNum(レジナンバー)
-- F_StaffName(担当者名)
-- F_ShohinName(商品名)
-- F_Discount(割引額)
-- F_PayMethod(支払方法)
-- F_NanacoNum(nanacoナンバー)
-- F_Deposit(預り金)
-- F_Change(おつり)
-- F_ShopNum(店舗No)
-- F_Acknowledge(領収書F)
CREATE TABLE T_TradeList(
F_TradeNum int(4) unsigned zerofill not null auto_increment,
F_Date timestamp not null default 0,
F_ReceiptNum int(4) zerofill unique not null,
F_RegiNum int(3) zerofill not null,
F_StaffName nvarchar(12) not null,
F_ShohinName nvarchar(30) not null,
F_Discount int(5),
F_PayMethod nvarchar(20) not null,
F_NanacoNum int(16) unsigned,
F_Deposit int(7) unsigned not null,
F_Change int(7) unsigned not null default 0,
F_ShopNum int(3) unsigned zerofill not null,
F_Acknowledge int(4) zerofill,
primary key(F_TradeNum,F_Date),
foreign key(F_Date) references T_Calendar(F_Date),
foreign key(F_StaffName) references T_Staff(F_StaffName),
foreign key(F_ShohinName) references T_VendorShohin(F_ShohinName),
foreign key(F_NanacoNum) references T_NanacoProfile(F_NanacoNum),
foreign key(F_ShopNum) references T_Staff(F_ShopNum)
);
-- テーブル順番8
-- お客さん商品テーブル(T_CustomerShohin)作成
-- F_TradeNum(取引No)
-- F_ShohinName(商品名)
-- F_ShohinNum(商品数)
CREATE TABLE T_CustomerShohin(
F_TradeNum int(4) unsigned zerofill not null,
F_ShohinName nvarchar(30) not null,
F_ShohinNum int(3) unsigned not null,
primary key(F_TradeNum,F_ShohinName),
foreign key(F_TradeNum) references T_TradeList(F_TradeNum)
);

以上の条件でテーブルを作成すると、以下のエラーメッセージが出てきます
ERROR 1005 (HY000) at line 91 in file: '07.sql': Can't create table kadai04.t_tradelist (errno: 150 "Foreign key constraint is incorrectly
formed")
ERROR 1005 (HY000) at line 117 in file: '07.sql': Can't create table kadai04.t_customershohin (errno: 150 "Foreign key constraint is incorr
ectly formed")
どういう理由かわかりますでしょうか?

ER図は一応作成しています
ER図です

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

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

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

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

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

m.ts10806

2017/07/18 07:38

課題ですか?エラーメッセージの意味については調べて理解できましたか?
meidochan

2017/07/18 07:52

返信ありがとうございます。実際に外部参照を使ったテーブル、DBを作ってみようという課題です。foreign key constraint is incorrectly formedで検索したところ日本語の検索結果が2件出てきたため、一応読ませていただきましたが、その中の「外部キーはプライマリテーブルの行にある候補キーであるか、値がないか(NULL値)のどちらかである必要がある」という一文が理解できませんでした
m.ts10806

2017/07/18 07:55 編集

Google翻訳でもじゅうぶんにプログラマー向けの日本語に訳してくれるのでご利用ください。マニュアルでも何でもプログラミング言語は基本は英語なので日本語文献ばかりを追い求めているといずれ壁にぶちあたって詰まります。
meidochan

2017/07/18 08:01

返信ありがとうございます。なるほどそうですよね、Google翻訳はあまり誤訳などが多かったため使うことがあまりなく、やはり英語を勉強するしかないなと思っていましたが、使えるのでしたら是非用いて探してみます
m.ts10806

2017/07/18 08:05

超正確な訳ではなくても文脈を掴むには有用だと思いますよ。最近ではプログラミングな内容はプログラマー向けになってるように思いますし。長文でも一発で訳してくれるので重宝しています。
meidochan

2017/07/18 08:10

なるほど使ってみます(#^.^#)
guest

回答5

0

SQLの知識はどのレベルなのでしょうか?
外部キー制約はあれば便利ですが、これがネックになってトラブルの原因に
なるケースもあります。
もしあまり知識もなく上記処理をしているようでしたら、、まずは
外部キー制約を指定しないでテーブルを構築しておき、必要に応じて
SQL文を発行する際に普通にリレーションしたほうが良いのではないでしょうか?

投稿2017/07/18 07:42

yambejp

総合スコア114572

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

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

meidochan

2017/07/18 07:57

返信ありがとうございました SQLの知識はなんとか調べながらやっているという感じです 外部キー制約を指定しないテーブルを構築し、実行するというのは既にさせていただいています 普通にリレーションというのはどういうことでしょうか?
yambejp

2017/07/18 08:06

> 外部キー制約を指定しないテーブルを構築し、実行するというのは既にさせていただいています 外部キー制約のエラーがでてますし、create table構文の中で foreign key指定していますよね? > 普通にリレーション 人によっては外部キー制約をもってリレーションの基本と教える人も いますが、普通に制約がなくてもjoinをすればいいという意味です
meidochan

2017/07/18 08:17

返信ありがとうございます 外部キー制約のエラーがでてますし、create table構文の中で foreign key指定していますよね? >前に外部キーを指定しないテーブル構築⇒実行が成功したため、今回create文の中にforeign keyを加えて指定しました 普通にリレーション>なるほどjoinのことリレーションとおっしゃるのですね
guest

0

MySQL workbenchというアプリケーションがあります。(無料です)
そちらでデータベーステーブルを作った方がわかりやすくていいですよ。

errorですが親DBが違う可能性があります。データ型と長さとビット署名だけでなく、外部キーが "同じ型の"でなければならないという事実が照合にも適用されます。

モデル内で照合を混ぜるのではないでしょうか?そうしても、プライマリキーフィールドと外部キーフィールドが照合タイプと同じであることを確認してください。

投稿2017/07/18 08:42

TennousuAtene

総合スコア76

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

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

meidochan

2017/07/18 11:31

回答ありがとうございます MySQL workbenchですね、使ってみます 親DBが間違っている( foreign key(F_ShopNum) references T_Staff(F_ShopNum) がうまくいってない、外部キー制約に反する)と自分も思います モデル内で照合を混ぜるとはどういうことでしょうか?
guest

0

場所を特定しても、原因が?になる可能性があるので、補足しますね。

エラーの箇所は
foreign key (F_StaffName) references T_Staff(F_StaffName),
です。

F_StaffName項目が、T_TradeListを含めて”どのテーブルにおいても”、1:多であるため、
外部キーに相応しくないためにエラーが出ています。

どうしても外部キーにされたいのであれば、

foreign key (F_StaffName) references T_Staff(F_StaffName),
foreign key (F_ShopNum) references T_Staff(F_ShopNum)

を1つにまとめて
foreign key (F_ShopNum, F_StaffName) references T_Staff(F_ShopNum, F_StaffName),
にすることで、エラーが解除できると思われます。

投稿2017/07/18 12:57

tomari_perform

総合スコア760

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

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

tomari_perform

2017/07/18 13:00

コメントに追記したつもりが、、、重複回答すみませんm(__)m
guest

0

ベストアンサー

下記、ご確認ください。

  • 外部キーに指定しているテーブルに対象のデータはあるか

例えば商品テーブルとカテゴリーテーブルがあって商品テーブルのカテゴリーコードに外部キーが貼ってあるとする。
その時に商品テーブルのデータにカテゴリーコードが指定してあってもそのカテゴリーコードがカテゴリーテーブルにないような状態が起きていないか

あと外部キーなり参照なりでDBを構築する際は関係図を書いたほうがいいです(外部キー使ってなくてもあった方が良い)
関連性・関係性を含めた完成図がイメージできていない状態で追っているとあるべき形には中々到達できません。
特に外部キーは、「する側」「される側」の方向を間違うとグチャグチャになり収拾がつかなくなります。

綺麗に書くに越したことはないですが(そういうアプリもあるはず)
最初は手書きでもじゅうぶんです。

投稿2017/07/18 08:04

m.ts10806

総合スコア80765

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

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

meidochan

2017/07/18 08:09

返信ありがとうございます、ER図は一応作成済みです。画像添付しておきました
guest

0

解決方法(そもそも外部キーを設定せず、インデックスにする等)は理解されているようなので、
原因の特定方法を回答します。

T_TradeListテーブルのcreate table文内の
foreign key句を1行ずつ削除して実行、を繰り返して特定できると思います。

投稿2017/07/18 12:16

編集2017/07/18 12:35
tomari_perform

総合スコア760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問