2017-01-16 33 views
1

2桁の自動インクリメントに必要なテーブル間の関係を作成していますid_quotationseq_quotation。列id_quotation、私は既にそれをインクリメントする別のテーブル(tb_core_process_id_quotation)を参照しています。ERROR 1075テーブル定義が正しくありません。自動列が1つしかなく、キーとして定義する必要があります

以下の表(tb_core_process_customer_data)は、他の表がコモンズおよび主要顧客​​のデータを捕捉するために使用します。このデータベースのテーブル全体に共通する,id_quotationseq_quotationの3つの検証キーが必要です。

tb_core_process_customer_dataクエリ:

CREATE TABLE tb_core_process_customer_data(
cpf_cnpj VARCHAR(255) NOT NULL, 
id_quotation INT NOT NULL, 
seq_quotation INT NOT NULL AUTO_INCREMENT, 
name VARCHAR(255), 
dt_birth DATE, 
cd_insurance_type INT, 
PRIMARY KEY (cpf_cnpj, seq_quotation, id_quotation), 
FOREIGN KEY (cd_insurance_type) REFERENCES tb_nm_insurance_type(cd_insurance_type), 
FOREIGN KEY (id_quotation) REFERENCES tb_core_process_id_quotation(id_quotation) 
); 

tb_core_process_id_quotationクエリ:

CREATE TABLE tb_core_process_id_quotation(
id_quotation INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (id_quotation) 
); 

だから、私はこの3つのキー関係に困難持っていますし、この検証を行うこと。私は、次のメッセージが私を披露tb_core_process_customer_data作成しようとすると:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

答えて

1

MySQLは速くルックアップを行うために、AUTO_INCREMENTフィールド上のキーを使用しています。あなたはauto_incrementフィールドをpkの2番目のフィールドに置きました。したがって、MySQLはpkを使って自動インクリメントの値をチェックすることはできません。したがってエラーメッセージです。

問題を解決する方法はいくつかあります。

  1. seq_quotationフィールド上の別のキー(一意またはPKである必要はありません)を追加します。

  2. 自動増分値は、とにかくユニークになるため、pkとして単独で使用し、他の2つのフィールドに別のインデックスを追加することができます。一意のインデックスまたはpkにauto_incrementを付けて他のフィールドをパッケージ化するのは、MySQLを使用しない限り、少し意味がありません。 (下記の注記を参照)

  3. 動作しているかどうかはわかりませんが、seq_quotationを現在のPKの1番目のフィールドに移動しようとする可能性があります。

あなたの意図は、あなたがMyISAMテーブルやBDBテーブルタイプを使用するかを確認して、その後、グループごとにインクリメント番号を持つことが

  1. を自動インクリメントを使用していた場合は
  2. またはinnodbの場合auto_incrementを使用しない場合は、代わりにトリガーを使用してください(this question on SO for details参照)
関連する問題