1

212 個のテーブルを持つデータベースを最適化する必要があります。1 つのテーブルの主キーは、94 個のテーブルの外部キーとして機能します。たとえば、次のテーブルがあります。

create table CUSTOMER (
    CUSTOMER_ID BIGINT NOT NULL,
    CUSTOMER_NAME VARCHAR(255) NOT NULL UNIQUE,
    CONTACT_PERSON VARCHAR(255) NOT NULL,
    CUSTOMER_EMAIL VARCHAR(255) NOT NULL,
    ADDRESS VARCHAR(255),
    CITY VARCHAR(255),
    PHONE VARCHAR(255),
    FAX VARCHAR(255),

    constraint CUSTOMER_PK PRIMARY KEY (CUSTOMER_ID)
);

ここでCUSTOMER_IDは、94 個のテーブルの外部キーである参照として機能しています。例として 1 つのテーブルを次に示します。

create table CUSTOMER_STATUS (
    CUSTOMER_DETAILS_ID BIGINT NOT NULL,
    CUSTOMER_ID BIGINT NOT NULL,
    USER_ID BIGINT NOT NULL,
    TRIAL_PERIOD BIGINT NOT NULL,
    TRIAL_PERIOD_TYPE BIGINT NOT NULL,
    EXPIRY_DATE BIGINT NOT NULL,
    MAXIMUM_CLIENTS BIGINT NOT NULL,
    STATUS BIGINT NOT NULL,
    AUTO_AUTHORIZATION BIGINT NOT NULL,

    constraint CUSTOMER_STATUS_PK PRIMARY KEY (CUSTOMER_ID,CUSTOMER_DETAILS_ID),
    constraint CUSTOMER_STATUS_FK1 FOREIGN KEY (CUSTOMER_ID) references CUSTOMER(CUSTOMER_ID)
);

CUSTOMER_IDすべてのテーブルのデータ型を からBIGINTに変更する必要がありTINYINTますが、外部キー制約のためにエラーが発生します。

エラー:

mysql> alter table CUSTOMER MODIFY CUSTOMER_ID TINYINT;
    ERROR 1025 (HY000): Error on rename of '.\uds7\#sql-670_cdd' to '.\uds7\customer' (errno: 150)

テーブル データに影響を与えずに変更するにはどうすればよいですか?

4

2 に答える 2

2

それを直接行うことはできません。

あなたがすること

  • テーブルの主キーを参照するすべての制約 (外部キー) を削除しますCUSTOMER
  • 主キーのデータ型を変更できるようになりました
  • キーが参照されるデータ型と同じ外部キーのデータ型も変更します
  • 外部キー制約を再度追加します。
于 2013-01-17T15:34:34.113 に答える
0

スキーマを変更している間は、外部キー制約チェックを無効にすることができます:

SET foreign_key_checks = 0;
ALTER TABLE CUSTOMER        MODIFY CUSTOMER_ID TINYINT;
ALTER TABLE CUSTOMER_STATUS MODIFY CUSTOMER_ID TINYINT;
SET foreign_key_checks = 1;

外部キー チェックを再度有効にするときは、参照列と参照列の両方のデータ型 (整数の場合はサイズと符号を含む) が同じである必要があることに注意してください。

于 2013-01-17T15:50:34.953 に答える