2

何日も頭を悩ませていることを聞きたいのですが...

これが私が意味することです:

次の 2 つのテーブルを作成します。

CREATE TABLE IF NOT EXISTS journal (
  issn varchar(20) NOT NULL,
  j_title varchar(100) NOT NULL,
  j_publisher varchar(30) NOT NULL,
  PRIMARY KEY (issn)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS volume (
  volume_no int(11) NOT NULL,
  issn varchar(20) NOT NULL,
  year int(11) NOT NULL,
  PRIMARY KEY (issn,volume_no),
  FOREIGN KEY (issn) REFERENCES journal(issn)
) ENGINE=InnoDB;

これを作成しようとすると:

CREATE TABLE IF NOT EXISTS issue (
  issue_no int(11) NOT NULL,
  issue_pages varchar(10) NOT NULL,
  issue_date varchar(10) NOT NULL,
  issn varchar(20) NOT NULL,
  volume_no int(11) NOT NULL,
  PRIMARY KEY (issue_no,issn,volume_no),
  FOREIGN KEY (issn) REFERENCES journal(issn),
  FOREIGN KEY (volume_no) REFERENCES volume(volume_no)
) ENGINE=InnoDB;

エラーがスローされます (errno 150)

エラーは外部キー volume_no にあります。

それなしFOREIGN KEY (volume_no) REFERENCES volume(volume_no)

テーブルは問題なく作成されています....何が起こっているのか説明できません...何度も何度も見ましたが、何もありません!! 何が起こっているのか知っている人はいますか?

前もって感謝します!!

4

5 に答える 5

3

外部キーには含まれていませんissnが、実際にはprimary keyボリュームテーブルに含まれていることがわかりました。

CREATE TABLE IF NOT EXISTS issue (   issue_no int(11) NOT NULL,  
                                  issue_pages varchar(10) NOT NULL,   
                                  issue_date varchar(10) NOT NULL,  
                                  issn varchar(20) NOT NULL,  
                                  volume_no int(11) NOT NULL,   
                                  PRIMARY KEY (issue_no,issn,volume_no),   
                                  FOREIGN KEY (issn,volume_no) REFERENCES volume(issn,volume_no) ) ENGINE=InnoDB; 

以下のSQLフィドルを見てください。 http://sqlfiddle.com/#!2/55a63

于 2012-08-14T09:16:57.260 に答える
0

FOREIGNキーは、親テーブルのPRIMARYまたはキーを参照する必要があります。UNIQUE

テーブルに必要な外部キーは2つではなく、1つだけissueです。そして、次の主キーを参照する必要がありますvolume

CREATE TABLE IF NOT EXISTS issue (
  issue_no int(11) NOT NULL,
  issue_pages varchar(10) NOT NULL,
  issue_date varchar(10) NOT NULL,
  issn varchar(20) NOT NULL,
  volume_no int(11) NOT NULL,
  PRIMARY KEY (issn, volume_no, issue_no),
  FOREIGN KEY (issn, volume_no) 
    REFERENCES volume(issn, volume_no)
) ENGINE=InnoDB;
于 2012-08-14T09:21:45.693 に答える
0

おそらく volume_no は UNSIGNED である必要があります

于 2012-08-14T09:17:42.717 に答える
0

データベースにもほぼ同じ問題がありました。外部キーの定義ではなく、主キー フィールドの定義でした。

CREATE TABLE tblProcesses (

fldProcessesID SMALLINT(5) UNIQUE NOT NULL AUTO_INCREMENT ,

CREATE TABLE tblProcessesMessage ( fldProcesses TEXT NOT NULL,

fldProcessesID VARCHAR(15) NOT NULL DEFAULT 、

tblProcesses (fldProcessesID) の主キーには UNSIGNED キーワードがありませんでしたが、tblProcessesMessage (fldProcessesID) の外部キーには UNSIGNED キーワードがありました。このキーワードが問題の原因でした - フィールドのタイプに一貫性がありません。そこで、tblPreocesses の fldProcessesID に UNSIGNED キーワードを追加しました。

CREATE TABLE tblProcesses ( fldProcessesID SMALLINT(5) UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,

これが問題の解決に役立つことを願っています。よろしく、ニコラス

于 2012-08-14T09:44:03.223 に答える
0

親テーブルの PK が複数のフィールドである場合、FK 内のフィールドの順序は PK 内の順序と同じである必要があります。

issue: FOREIGN KEY (issn, volume_no) REFERENCES volume(issn, volume_no)

エラー 150 が発生しないようにするには、次の条件を満たす必要があります。

  1. 2 つのテーブルは である必要がありますENGINE=InnoDB
  2. 2 つのテーブルの文字セットは同じでなければなりません。
  3. 親テーブルの PK 列と FK 列は同じデータ型である必要があります。
  4. 親テーブルの PK 列と FK 列は、照合タイプが定義されている場合、照合タイプが同じである必要があります。
  5. 外部キー テーブルに既にデータがある場合、FK 列の値は、親テーブルの PK 列の値と一致する必要があります。

ソース:MySQL 外部キーを使用してテーブルを作成すると、errnoが発生します:150

于 2012-08-14T09:14:56.353 に答える