2

多くの人がすでにこの問題を抱えていましたが、他の投稿には適切な解決策がありませんでした.

「sales」という名前のテーブルと「host_flags」という名前のテーブルが 2 つあります。host_flags.sales_id から sales.id への外部キーが必要ですが、mysql では許可されません。各テーブルにプライマリ インデックスが定義されているので、なぜだろう...

host_flags テーブルには既に host_id 列に外部キーがありますが、最初に sales id の外部キーを作成しようとしても、できませんでした。

テーブルは次のようになります。

CREATE TABLE `sales` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `creation` datetime DEFAULT NULL,
  `lastupdate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `host_flags` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `host_id` int(11) DEFAULT NULL,
  `sales_id` int(11) DEFAULT NULL,
  `creation` datetime DEFAULT NULL,
  `lastupdate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `host_id6` (`host_id`),
  CONSTRAINT `host_id6` FOREIGN KEY (`host_id`) REFERENCES `hosts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `hosts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `creation` datetime NOT NULL,
  `lastupdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32225 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

次のエラー メッセージが表示されます。

MySQL said: Can't create table 'primarydata.#sql-191_1' (errno: 150)

ありがとう!

チャールズ

解決策が見つかりました

プライマリ インデックスのすべての int は、符号付きまたは符号なしのいずれかである必要があります。混合ではありません。

4

3 に答える 3

3

通常:

すべてのテーブルが構築された後、テーブル定義の外で FK 制約を宣言するのが好きです。

ALTER TABLE `tbl`
    ADD CONSTRAINT `constr`
        FOREIGN KEY `fk_id` REFERENCES `ftbl`(`id`)
            ON UPDATE CASCADE
            ON DELETE CASCADE;

このようにして、問題が のデータ型のようなものではないことを確認できますtblfk_idのものと同じではありませんftblidUNSIGNED@Devartが言ったように)。または宣言していないftblidユニークです。テーブルの宣言の順序に関係なく。

これを行った後、制約をテーブル定義に統合し、制約を追加できるようにするためにテーブルを作成する必要がある順序を考慮することができます。

あなたの問題:

-- creating the sales table
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

-- creating the host_flags table
`sales_id` int(11) DEFAULT NULL,

-- the sales.id is declared as unsigned
-- the host_flags.sales_id is declared signed
于 2012-07-24T14:40:59.103 に答える
0

Recursedの答えに加えて:

外部キー制約の名前はデータベーススコープ内で一意である必要があるという要件があります。たぶん名前を変更してもうまくいくでしょうか?

MySQLコミュニティフォーラムには、特定の状況に対するいくつかの解決策を含む問題についての巨大なスレッドもあります。

于 2012-07-24T14:35:16.100 に答える
0

考えられる 2 つのエラー:

  1. 参照列と参照列は同じ型である必要があります -int(11) unsigned
  2. 不明な参照テーブルhosts
于 2012-07-24T14:37:21.900 に答える