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

挿入ができない

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

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

  • 回答数1
  • 閲覧数1945
  • ありがとう数2

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

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

親の行は、users表、roles表に格納済ですか? INSERT INTO user_role (user_id, role_seq) VALUES ('aaaa', 1) を実行するには、 users表にuser_id='aaaa'の行、roles表にrole_seq=1の行が格納済であることが前提になります。

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

質問者からのお礼

ご返答ありがとうございます。 なるほど、そういえばまだそれらには挿入していませんでした・・・ 試したところ無事出来ました。ありがとうございます。

関連する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の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
  • usersテーブルの構成カラムについて

    MySQLバージョン4.1.16を使用しています。 このジャンルでお願いします。 よく全ての基本となるusersテーブル(IDとパスワードを入れるユーザの基本テーブル) があると思うのですが、それを構成するカラムはどのような感じにするのが良いのでしょうか? 自分は、 CREATE TABLE `users` ( `user_id` varchar(16), `password` varchar(255) default NULL, `col1` varchar(255) NOT NULL, `col2` varchar(255) NOT NULL, PRIMARY KEY (`user_id`), ) ENGINE=InnoDB; このように代替キー(連番)を使わずにuser_idを主キー(unique)にして構成します。 理由としては、uniqueな列があるなら、わざわざ連番を割り当てる必要もないし、 他のテーブルがuser_idを外部キーとして持った時に、その表の外部キーの列が 数字であるよりも見やすいかなと思ったからです。 ただ一般的に出まわっているPHPフレームワークなどのテーブル構成ではusersテーブルというか ほとんどのテーブルに連番を使っている例があります。 次のusersテーブルは、PHPフレームワークのCakePHPで使われるusersテーブルの構成の例で、 連番を使用しています。 CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) collate utf8_unicode_ci default NULL, `password` varchar(255) collate utf8_unicode_ci default NULL, `group_id` int(11) NOT NULL, `disabled` tinyint(1) NOT NULL, `created` datetime default NULL, `modified` datetime default NULL, PRIMARY KEY (`id`), KEY `group_id` (`group_id`), KEY `disabled` (`disabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 使用状況によって、どちらが良い悪いというのは変わるのでしょうけど 基本的にusersテーブルというのはどのような構成にすべきなのでしょうか? ちなみに自分は連番は○○_seqというカラム名にしてます(ただこれも 一般的には○○idを連番にしてるケースが多いので、どうすべきか迷っています・・・)

    • ベストアンサー
    • MySQL
  • 最初に挿入された行だけ取得したい

    このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user (name) VALUES ('user1'); INSERT INTO user (name) VALUES ('user2'); INSERT INTO user (name) VALUES ('user3'); CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (name) VALUES ('item1'); INSERT INTO item (name) VALUES ('item2'); INSERT INTO item (name) VALUES ('item3'); CREATE TABLE IF NOT EXISTS user_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id INT, item_id INT, PRIMARY KEY(id), FOREIGN KEY (item_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (user_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_item (user_id, item_id) VALUES (1, 1); INSERT INTO user_item (user_id, item_id) VALUES (2, 1); INSERT INTO user_item (user_id, item_id) VALUES (3, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 3); INSERT INTO user_item (user_id, item_id) VALUES (3, 3); user_itemテーブルでのselectで、 user_idが1で一番最初に挿入された行だけ を取得したいのですが、どのようなSQL文にすれば良いのでしょうか? この例なら INSERT INTO user_item (user_id, item_id) VALUES (1, 1);←取得 INSERT INTO user_item (user_id, item_id) VALUES (2, 1); INSERT INTO user_item (user_id, item_id) VALUES (3, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 2);←user_id=3が最初に挿入されているので取得しない INSERT INTO user_item (user_id, item_id) VALUES (1, 3);←取得 INSERT INTO user_item (user_id, item_id) VALUES (3, 3);

    • ベストアンサー
    • MySQL
  • 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; --------------------------------------------------------

    • ベストアンサー
    • MySQL
  • 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を追加するにはどのようにしたらいいのでしょうか?

  • カラム名でseqとidではどちらがふさわしいのでしょうか?

    mysql5.1.33を使用しています。 例えば、ユーザ情報を格納するuserテーブルがあって ユーザが決める半角英数字からなるIDを格納するuser_idカラムがあるとします。 そしてAuto Incrementなカラムも付け足すと、 [user] seq INT(11) NOT NULL AUTO_INCREMENT, user_id varchar(16) PRIMARY KEY (seq) UNIQUE KEY user_id (user_id) この場合はseqカラムが主キーになるわけですが、 一般的にはカラム名はseqではなくてidですよね? なんで自分はseqにしたかというと、 user_idカラムのidには文字(半角英字)のIDを、 seqは連番を意味づけさせたいと思いました。 つまり seqがつくカラム名は連番で idがつくカラム名は文字列 と直感的に分かりやすくなるだろうと思ったからなのですが、 みなさんはこのケース(そもそもこのカラム構成が正しいかは分かりませんが・・)の場合は、 どのようなカラム名を付けますか?

  • create時にFOREIGN KEYでエラー

    以下のSQL文を実行すると CREATE TABLE if not exists table_A ( id int(11) not null auto_increment, company_id int(11) not null, created_at datetime NOT NULL, updated_at timestamp NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE if not exists table_B ( id int(11) not null auto_increment, from_id int(11) not null, company_id int(11) not null, created_at datetime NOT NULL, updated_at timestamp NOT NULL, PRIMARY KEY (id) FOREIGN KEY (from_id) REFERENCES table_A(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 上記を実行すると以下のエラーがでます。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY (from_id) REFERENCES table_A(id) ON DELETE CASCADE ) ENGINE=Inn' at line 8 解決方法をご存知の方はご教示頂けますと幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • アクセスログテーブルの構造について

    このジャンルでお願いします。 よくアクセスログの解析を無料で(リンクを貼ったりして)行ってくれるサービスがありますが、 そのデータベースの構造というかテーブルの構造はどのようになっているのでしょうか? 例えば、膨大なレコード数になると思うので それを利用するユーザー毎にテーブルを分けるとかするのでしょうか? あるいはユーザー毎、年毎、月毎、日毎、に分けるとか? 本来ならテーブルを分割したりするのは違うんじゃないかなぁと思ったりするのですが、 なので次のように、 CREATE TABLE `accesslog` ( `id` int NOT NULL auto_increment, `user_id` varchar(16), `created` datetime, `ip` varchar(64), FOREIGN KEY(`user_id`) REFERENCES `user`(`id`) ); ユーザーも全ての期間のデータも1つのテーブルで管理するのが普通だとは思うのですが、 アクセスログだけは利用するユーザー数にもよりますがやはり膨大になりますよね? そうすると1つのテーブルだと無理があると思うのです。 あるいは単にテキストファイルとして保存する方法もあるのかな?と思うのですが、 やはりなにかとSQLで操作したいのでMySQLなどのテーブルの設計が知りたいです。

  • 主キーレコードを削除する場合

    userテーブルのu_idを主キーとしており、 他でもu_idを主キーとしてあるテーブルがあります。 delete from user where u_id = 2  で、u_id = 2 のレコードを削除させようとしたのですが、 Cannot delete or update a parent row: a foreign key constraint fails (`aaaaa`.`message`, CONSTRAINT `message_ibfk_2` FOREIGN KEY (`m_guid`) REFERENCES `user` (`u_id`) ON UPDATE CASCADE) のようなエラーがでます。 どのような意味でしょうか?また、これを改善するには設定、sql文はどのようにしたらよいでしょうか? ご回答お願いいたします。

専門家に質問してみよう