1

MySQL マニュアルで、「しかし、システムは、参照される列が UNIQUE であるか、NOT NULL と宣言されるという要件を強制しません。」と読みました。そこで、2 つのテーブルを作成しようとしました。

CREATE TABLE album(
    id INT, 
    title VARCHAR(20)) DEFAULT CHARSET=utf8;
CREATE TABLE track2(   
    album int,   
    dsk INTEGER,   
    posn INTEGER,   
    song VARCHAR(255),   
    FOREIGN KEY (album) REFERENCES album(id) ) default charset=utf8;

とエラーがあります: ERROR 1005 (HY000): テーブル 'b.track2' を作成できません (errno: 150)

SQL 標準から逸脱しているが、MySQL によって提供され、そのマニュアルに記載されている機能を使用できないのはなぜですか?

4

2 に答える 2

1

私はそれを行う方法を理解しました:

create table album2 (id int, title varchar(20), key (id));
create table track2 (
     track_id int primary key, 
     album_id int not null, 
     title varchar(100), 
     foreign key (album_id) references album2 (id)
);

mysql> show create table album2;
+--------+-----------------------------
| Table  | Create Table
+--------+-----------------------------
| album2 | CREATE TABLE `album2` (
  `id` int(11) DEFAULT NULL,
  `title` varchar(20) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+-----------------------------

mysql> show create table track2;
+--------+-----------------------------------------------------------------------
| Table  | Create Table
+--------+-----------------------------------------------------------------------
| track2 | CREATE TABLE `track2` (
  `track_id` int(11) NOT NULL,
  `album_id` int(11) NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`track_id`),
  KEY `album_id` (`album_id`),
  CONSTRAINT `track2_ibfk_1` FOREIGN KEY (`album_id`) REFERENCES `album2` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+-----------------------------------------------------------------------

必要なのは、album2で非一意キーを作成することだけです。

于 2012-06-21T03:32:35.240 に答える
0

これは、表のように設定idしていないために発生しています。PRIMARY KEYalbum

使用する

CREATE TABLE album(
    id INT PRIMARY KEY, 
    title VARCHAR(20)) DEFAULT CHARSET=utf8;

CREATE TABLE track2(   
    album int,   
    dsk INTEGER,   
    posn INTEGER,   
    song VARCHAR(255),   
    FOREIGN KEY (album) REFERENCES album(id) ) default charset=utf8;

デモ


更新 1

読んでください

外部キーは一意でないインデックスを参照できますか?

非一意キーによるMysql外部キー - どのように可能ですか?


更新 2

あなたのエンジンは MyISAMだと思います。MYSQL manualによると、ステートメントは InnoDB に対して有効であり、MyISAM に対して有効ではありません。

さらに、MySQL と InnoDB では、パフォーマンスのために、参照される列にインデックスを付ける必要があります。ただし、システムは、参照される列が UNIQUE である、または NOT NULL と宣言されるという要件を強制しません。一意でないキーまたは NULL 値を含むキーへの外部キー参照の処理は、UPDATE や DELETE CASCADE などの操作に対して明確に定義されていません。UNIQUE および NOT NULL キーのみを参照する外部キーを使用することをお勧めします。

于 2012-06-20T15:33:04.567 に答える