1

通常、私はPostgreSQLを使用していて、問題は発生しませんでしたが、MySQLを使用する必要があり、いくつかの問題が発生しています。データベースuser_main_dbにテーブルを作成しています。外部キーにはいくつかの問題があります。phpMyAdminは常に次のエラーを表示します。

1005-テーブル'user_main_db.user_main'を作成できません(errno:150)(

engine = InnoDB&page = Status&token = 136fdbb820093986c79180b24adb304d">詳細...)

これは、データベースuser_main_dbに作成しようとしているテーブルです。

CREATE TABLE user_main
(
uid INTEGER,
fn VARCHAR(40) NOT NULL,
ava VARCHAR(255),
gender tinyint(1) NOT NULL,
dob DATE NOT NULL,
country_id INTEGER, 
PRIMARY KEY (uid),
FOREIGN KEY ( uid ) REFERENCES user_basic_db.user_basic(uid) ON DELETE CASCADE ON UPDATE            CASCADE,
FOREIGN KEY ( country_id ) REFERENCES countries_db.countries(country_id) ON DELETE CASCADE   ON UPDATE CASCADE
);

これは、データベースuser_basic_dbのテーブルuser_basicです。

CREATE TABLE user_basic
(
uid INTEGER AUTO_INCREMENT,
email VARCHAR(40) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (uid)
);

これは、データベースcountries_dbのテーブルの国です。

 CREATE TABLE countries(
    country_id INTEGER PRIMARY KEY AUTO_INCREMENT,
    country VARCHAR(40) NOT NULL UNIQUE
    )

奇妙なことは、テーブルを次のように定義するときです。

CREATE TABLE user_main
(
uid INTEGER PRIMARY KEY REFERENCES user_basic_db.user_basic(uid)  ON DELETE CASCADE ON    UPDATE CASCADE,
 VARCHAR(40) NOT NULL,
ava VARCHAR(255),
gender tinyint(1) NOT NULL,
dob DATE NOT NULL,
country_id INTEGER REFERENCES countries_db.countries(country_id) ON DELETE CASCADE ON  UPDATE CASCADE
);

クエリは正常に実行されますが、外部キーは作成されません。「リレーショナルビュー」を開くと、uidとcountry_idへの参照がなく、そのようなIDを持つ国がない場合でもuser_main(country_id)に挿入できます。誰かを助けてください。ありがとうございました。

4

2 に答える 2

2

外部キー制約に関するMySQLマニュアルを確認してください。

ドロップされたテーブルを再作成する場合は、それを参照する外部キー制約に準拠する定義が必要です。前述のように、正しい列名とタイプが必要であり、参照されるキーにインデックスが付いている必要があります。これらが満たされない場合、MySQLはエラー番号1005を返し、エラーメッセージでエラー150を参照します。

おなじみですね!?

テーブルを削除し、次のような整形式の構文で新しいテーブルを作成することをお勧めします。

CREATE TABLE `countries` (
  `country_id` int(11) NOT NULL AUTO_INCREMENT,
  `country` varchar(40) NOT NULL,
  PRIMARY KEY (`country_id`),
  UNIQUE KEY `country` (`country`)
) ENGINE=InnoDB;

CREATE TABLE `user_basic` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(40) NOT NULL,
  `password` varchar(40) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB;

CREATE TABLE `user_main` (
  `uid` int(11) NOT NULL,
  `fn` varchar(40) NOT NULL,
  `ava` varchar(255) DEFAULT NULL,
  `gender` tinyint(1) NOT NULL,
  `dob` date NOT NULL,
  `country_id` int(11) NOT NULL,
  PRIMARY KEY (`uid`),
  KEY `user_main_ibfk_2` (`country_id`),
  CONSTRAINT testc1
  FOREIGN KEY (`country_id`) REFERENCES `countries` (`country_id`) 
    ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT testc2
  FOREIGN KEY (`uid`) REFERENCES `user_basic` (`uid`) 
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

これでうまくいくはずです。

于 2012-06-12T12:01:42.373 に答える
0

storage enginesMySQLには、さまざまな機能とパフォーマンスプロファイルを提供するという概念があります。外部キーを提供しないMyISAMストレージエンジンを使用してテーブルを作成したと思われます。

INNODBエンジンを使用している場合は、外部キーが意図したとおりに機能すると思われます。

編集

ステートメントの閉じ括弧のENGINE=InnoDBに句を指定して、ストレージエンジンを設定しますCREATE TABLE

于 2012-06-12T11:51:07.027 に答える