0

私は1つの従業員テーブルを持っています:

create table employee
(number integer primary key,
 name varchar(20),
 salary integer,
 manager integer,
 birthyear integer,
 startyear integer);

ここで、manager 列は従業員マネージャーの従業員番号です。つまり、いくつかの行は次のようになります。

number | name               | salary | manager | birthyear | startyear |

    32 | Smythe, Carol      |   9050 |     199 |      1929 |      1967 |
    33 | Hayes, Evelyn      |  10100 |     199 |      1931 |      1963 |
    35 | Evans, Michael     |   5000 |      32 |      1952 |      1974 |

明確にするために、マイケル・エヴァンスのマネージャーはキャロル・スマイスです。さらに 2 つの点として、このテーブルには外部キー制約がなく、manager 列にいくつかの NULL 値があります。ここで、すべてのマネージャーを含む Managers テーブルを作成したいと思います。私はこのようなことをします。

create table Mgr(
 Mgr_id INTEGER PRIMARY KEY,
 bonus INTEGER,
 FOREIGN KEY (Mgr_id) REFERENCES employee(manager)); 

しかし; これは機能せず、エラーが発生します。誰かが理由を説明してもらえますか? 答えを探しましたが、良い説明が見つかりません。前もって感謝します。

エラー:

ERROR 1005 (HY0000): Can´t create table johnson.mgr (errno: 150) 
4

3 に答える 3

0

外部キーと参照されるキーの対応する列は、型を変換せずに比較できるように、類似した内部データ型を持っている必要があります。整数型のサイズと符号は同じでなければなりません。文字列型の長さは同じである必要はありません。非バイナリ (文字) 文字列列の場合、文字セットと照合は同じである必要があります。

managerId テーブルに適切なデータ型を指定しているかどうかを確認してください。

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

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

もう1つの問題は、同じ列に外部キーと主キーを作成していることです

お役に立てれば

http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.htmlを参照してください。

于 2013-02-14T11:48:33.443 に答える
0

同じフィールドとテーブルに主キーと外部キーを作成しようとしています。

以下のように従業員テーブルの定義を変更する必要があります。

create table employee
(number integer primary key,
 name varchar(20),
 salary integer,
 manager integer,
 birthyear integer,
 startyear integer
FOREIGN KEY (manager) REFERENCES Mgr(Mgr_id) 
);

そして、テーブル定義Foreign Keyから句を削除しますMgr

于 2013-02-14T11:52:26.620 に答える
0

やりたいことは理にかなっています。あなたのやり方はそうではありません。データベースがマネージャーを識別する方法を変更する必要があります。現在、employee.manager の値によってマネージャーを識別します。完了すると、Mgr の行によってマネージャーが識別されます。

最初に使用可能なデータがあることを確認してください。従業員テーブルに存在しない ID 番号を探します。これを試して。

select manager 
from employee 
where manager not in (select number 
                      from employee);

返されるすべての行はエラーを表します。従業員に対応する行がないマネージャーの ID 番号です。多くの進歩を遂げる前に、それらを修正する必要があります。

これらのエラーを修正したら、テーブル Mgr を作成します。

create table Mgr (
  Mgr_id INTEGER PRIMARY KEY,
  bonus INTEGER NOT NULL DEFAULT 0,
  FOREIGN KEY (Mgr_id) REFERENCES employee(manager)
); 

Mgr にクエリを入力します。これらの線に沿った何かが機能するはずです。

insert into Mgr (Mgr_id) 
select distinct manager 
from employee;

ボーナスの正しい値でそのテーブルを更新します。そのデータを便利な場所に保存していない場合は、手動で行う必要がある場合があります。

データベースに関する限り、列 employee.manager を削除できます。そして、その列を削除する必要がありますが、今はそうではありません。従業員テーブルを見ることでマネージャーを識別できると考えるアプリケーション コードがどうなるかを検討する必要があります。

  • 列をドロップするだけで、修正されるまでアプリケーション プログラムが失敗するのを待つことができます。
  • これらの変更は、たとえば 3 月 1 日に行われることをすべてのアプリケーション開発者に警告することができます。
  • 変更を行い、列をそのままにして、アプリケーション開発者に警告し、employee.manager への変更を防ぐための措置を講じることができます。
  • これらの変更を行い、employee テーブルの名前を変更し、古い構造 (employee と Mgr を結合する必要があります) と「employee」という名前を持つ更新可能なビューを作成できます。このオプションは理想に近く、アプリケーション コードを変更する必要はありませんが、MySQL が更新可能なビューをどの程度サポートしているかはわかりません。それは不可能かもしれません。
于 2013-02-14T12:32:18.103 に答える