• ベストアンサー
  • すぐに回答を!

ForeignKeyの作成方法について

MySQLでForeign Keyを作成しようと、以下のSQLを実行したところ、 テーブルは作成されず、エラーが発生しました。 エラーメッセージは  Can't create table 'test.user' (errno: 150) です。 また、 INDEX (CompanyID), FOREIGN KEY (CompanyID) REFERENCES m_Company(CompanyID), の2行を外すと通常通りテーブルは作成できます。 どうやったら、Foreign Keyを設定できるでしょうか。 テーブル作成後に、後付でForeign Keyを設定しようと心みましたが、 それも失敗しました。 -------------------------------------------------------- CREATE TABLE user ( `Seqno` int(11) NOT NULL AUTO_INCREMENT, `UserID` varchar(8) NOT NULL DEFAULT '', `Password` varchar(8) DEFAULT NULL, `Mail` varchar(100) DEFAULT NULL, `Valid` tinyint(4) DEFAULT NULL, `CompanyID` int(11) DEFAULT NULL, INDEX (CompanyID), FOREIGN KEY (CompanyID) REFERENCES m_Company(CompanyID), PRIMARY KEY (`Seqno`,`UserID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --------------------------------------------------------

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数247
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

こんばんは。 情報が少ないです・・・。 m_CompanyはInnoDB? CompanyIDの型(m_Companyの)は? ここ見てください・・・。 http://dev.mysql.com/doc/refman/4.1/ja/innodb-foreign-key-constraints.html

共感・感謝の気持ちを伝えよう!

質問者からの補足

takaさん、ご返事ありがとうございます。 自己解決しました。 自分もtakaさんが教えてくれたページを見て、解決できました。 参照元のCompanyIDと参照先のCompanyIDで型の互換が取れていないのが問題でした。 一方では、参照キーにunsignedを設定してたんです。 マイナスの値はつかないし、いいかなーーって思ってたんです。 でも、もう一方にはつけてませんでした。 参照元と参照先のunsignedを省いたところ、うまくクエリを投げる事に成功しました。 ありがとうございます。 Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.

関連するQ&A

  • 外部キーを持つテーブルを作成しようとするとエラーがでます

    XAMPPバージョン1.5.4 MySQLバージョン4.1.16 という環境で、my.cnfでInnoDBを使えるように設定しています。 そして CREATE TABLE admin_roles (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(12) NOT NULL) ENGINE = InnoDB; という非参照列idを持つadmin_rolesテーブルを作り(成功し)、さらに role_idを外部キーとしてadmin_user_roleテーブルを作成しようとすると、 Error Number: 1005 Can't create table '.\test\admin_user_role.frm' (errno: 150) CREATE TABLE admin_user_role (userid VARCHAR(12) NOT NULL, role_id BIGINT DEFAULT 0, FOREIGN KEY (role_id) REFERENCES admin_roles(id) ON DELETE CASCADE) ENGINE = InnoDB; というエラーが出てしまいます・・・ admin_user_roleの記述のどこが間違っているのでしょうか?

    • ベストアンサー
    • MySQL
  • 挿入ができない

    MySQLバージョン4.1.16を使用しています。 「user_role」テーブルを 「users」テーブルのuser_idカラムと「roles」テーブルのrole_seqカラムを外部キーとして作成します。 そして「user_role」テーブルにuser_id「aaaa」とrole_seq「1」をINSERTしようとしたのですが、 以下のようなエラーが出てしまいます。 Cannot add or update a child row: a foreign key constraint fails (`test/user_role`, CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE) INSERT INTO user_role (user_id, role_seq) VALUES ('aaaa', 1) どこらへんが間違っているのでしょうか? 以下の手順でテーブルを作成しました。 CREATE TABLE users (user_id VARCHAR(16) NOT NULL, password VARCHAR(32) NOT NULL, regist_date DATETIME NOT NULL, PRIMARY KEY (user_id)) ENGINE = InnoDB CREATE TABLE roles (role_seq BIGINT UNSIGNED AUTO_INCREMENT, name VARCHAR(32) NOT NULL, PRIMARY KEY (role_seq)) ENGINE = InnoDB CREATE TABLE user_role (role_seq BIGINT UNSIGNED, user_id VARCHAR(16) NOT NULL, FOREIGN KEY (role_seq) REFERENCES roles(role_seq) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE) ENGINE = InnoDB

    • ベストアンサー
    • MySQL
  • 複数のテーブルのレコードを DELETEする方法 ( 外部参照 テーブル )

    バージョンは、8.1.5 です。 下記のように外部参照された 2つのテーブルがあります。 userテーブル  --------------------  userid   | integer  passwd  | text  -------------------- user_rel_groupテーブル  ---------------------  userid  | integer  gatid   | integer  --------------------- Foreign-key constraints: "user_rel_group_userid_fkey" FOREIGN KEY (userid) REFERENCES user(userid) そこで、 userテーブルからユーザーを削除した場合、 => DELETE from user where userid = 10030118; ERROR: update or delete on "user" violates foreign key constraint "user_rel_group_userid_fkey" on "user_rel_group" DETAIL: Key (userid)=(10030118) is still referenced from table "user_rel_group". とエラーがでますが、【 MySQL 】ではDELETE文にて、 DELETE member, user_rel_group FROM user LEFT JOIN user.userid = user_rel_group.userid WHERE userid = 10030118; のようにテーブルを結合して、複数のテーブルのレコードを削除できるようですが、 PostgreSQLは、出来ますでしょうか? また、 テーブル作成時に、 CREATE TABLE user_rel_group (   userid integer, ....   constraint group_user_foreignkey   foreign key(userid) references user(userid) on delete cascade ); と、制約が必須だったのでしょうか? どなたかご教授お願い致します。

  • FOREIGN KEYの追加について。

    FOREIGN KEYの追加について。 MySQL5.1.37 CREATE TABLE `goods` ( `id` int NOT NULL AUTO_INCREMENT, `num` int NOT NULL DEFAULT '1', PRIMARY KEY (`id`), index (`num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `sales` ( `id` int NOT NULL AUTO_INCREMENT, `num` int NOT NULL DEFAULT '1', PRIMARY KEY (`id`), index (`num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 上記のようなテーブルを作り、salesテーブルにCSVファイルからデータをインポートしたのち、FOREIGN KEYを子テーブルに追加したいのですが、下記のようなエラーになります。 ALTER TABLE `sales` ADD FOREIGN KEY ( `num` ) REFERENCES `test`.`goods` ( `num` ) ON UPDATE CASCADE ; MySQLのメッセージ: ドキュメント #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`#sql-561_cf`, CONSTRAINT `#sql-561_cf_ibfk_1` FOREIGN KEY (`num`) REFERENCES `goods` (`num`) ON UPDATE CASCADE) データをインポートしたのちにFOREIGN KEYを追加するにはどのようにしたらいいのでしょうか?

  • varchar型を主キーに…

    現在サーブレット/JSPを利用してDBにユーザアカウントを登録、削除、更新、一覧をできるようするシステムを作成しています。 テーブルを create table loginuser ( userId char(16) not null default '', passwd char(16) not null default '', name varchar(50) not null default '', accessFlg int(1) not null default '0', primary key(userId)); で作成しました。 IDが数字の時はDBに登録ができるのですがIDに文字を入力するとDBに登録されません。 主キーをvarchar型で使用するのは不可能なのでしょうか? ご返答をよろしくお願いします。

  • Oracleでテーブルを作成する際に、インデクスの作成先を指定したい。

    以下のようにテーブルを作成しようとしてます。 CREATE TABLE TEST_USER.M_USER ( ID char(4), NAME varchar2(40) NOT NULL), CONSTRAINT PK_USER PRIMARY KEY(ID) ); さて、プライマリキーを定義しているので、インデクスが作成されるはずです。 この作成先のテーブルスペースを指定したいのですが、方法が解りません。 CREATE TABLEの紹介をしているサイトにものっていなくて、途方にくれています・・・。 CONSTRAINT句を使えばいいのでしょうか?

  • postgres table作成時にindex付与

    MySQLでは以下のようにテーブル作成時にインデックス付与ができます。 CREATE TABLE test ( a int(11) NOT NULL DEFAULT '0', b int(11) DEFAULT NULL, PRIMARY KEY (a), KEY test_idx (b), -- ★インデックス その1 KEY test_idx2 (a) -- ★インデックス その2 ); ポスグレではできませんか?

  • MySQLのFOREIGN KEYについて

     MySQLのFOREIGN KEYについて質問です。 下記のようにitemテーブルを作ってからarrivalhistoryテーブルを作ろうとすると ERROR 1005 (HY000): Can't create table 'xxx_db.arrivalhistory' (errno: 150) というエラーが出てしまいます。 自分でもForeign keyの作り方等調べてはみたのですが、 上手く解決することができません。 どなたかアドバイス下さい。お願いします。 ・親 create table item ( id bigint not null primary key, itemno VARCHAR(50) ) engine=InnoDB; ・子 create table arrivalhistory( id int primary key, itemno varchar(50), arrivaldate date, index(itemno), foreign key(itemno) references item(itemno) on update cascade on delete cascade ) engine=InnoDB;

    • ベストアンサー
    • MySQL
  • text型とuniqueについて

    mysqlでテーブル作成したいのですが l_urlのtext型のuniqueは、どうやって作成したらいいのでしょうか? 後、テーブル作成を実際すると結構つまずくので練習したいのですが 何かいい勉強方法はありますか? /* リンクデータ用テーブル作成 CREATE TABLE linkdata ( id int NOT NULL auto_increment, l_url text NOT NULL unique, l_title varchar(100) NOT NULL default '', l_comment varchar(255) default NULL, l_date datetime default NULL, PRIMARY KEY (id) ); 実行結果: ERROR 1170 (42000): BLOB/TEXT column 'l_url' used in key specification without a key length mysql>

    • ベストアンサー
    • MySQL
  • MySQLのテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL

専門家に質問してみよう